1d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens// 3d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Licensed under the Apache License, Version 2.0 (the "License"); 4d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// you may not use this file except in compliance with the License. 5d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// You may obtain a copy of the License at 6ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens// 7d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 8ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens// 9d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Unless required by applicable law or agreed to in writing, software 10d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// distributed under the License is distributed on an "AS IS" BASIS, 11d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// See the License for the specific language governing permissions and 13d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// limitations under the License. 14ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 15ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens#include "Direct3DTexture9.hpp" 16ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 17ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens#include "Direct3DDevice9.hpp" 18ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens#include "Direct3DSurface9.hpp" 19ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens#include "Resource.hpp" 20ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens#include "Debug.hpp" 21ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 22ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens#include <assert.h> 23ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 24ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capensnamespace D3D9 25ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens{ 26ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens Direct3DTexture9::Direct3DTexture9(Direct3DDevice9 *device, unsigned int width, unsigned int height, unsigned int levels, unsigned long usage, D3DFORMAT format, D3DPOOL pool) : Direct3DBaseTexture9(device, D3DRTYPE_TEXTURE, format, pool, levels, usage), width(width), height(height) 27ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 28ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(levels == 0) 29ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 30ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens this->levels = sw::log2(sw::max((int)width, (int)height, 1)) + 1; 31ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 32ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 33e72c4328ae76674f0f4c84838ebf5e0be77aa78dNicolas Capens for(unsigned int level = 0; level < sw::MIPMAP_LEVELS; level++) 34ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 35ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(level < this->levels) 36ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 37ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens surfaceLevel[level] = new Direct3DSurface9(device, this, width, height, format, pool, D3DMULTISAMPLE_NONE, 0, false, usage); 38ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens surfaceLevel[level]->bind(); 39ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 40ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens else 41ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 42ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens surfaceLevel[level] = 0; 43ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 44ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 45ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens width = sw::max(1, (int)width / 2); 46ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens height = sw::max(1, (int)height / 2); 47ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 48ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 49ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 50ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens Direct3DTexture9::~Direct3DTexture9() 51ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 52ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens resource->lock(sw::DESTRUCT); 53ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 54e72c4328ae76674f0f4c84838ebf5e0be77aa78dNicolas Capens for(int level = 0; level < sw::MIPMAP_LEVELS; level++) 55ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 56ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(surfaceLevel[level]) 57ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 58ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens surfaceLevel[level]->unbind(); 59ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens surfaceLevel[level] = 0; 60ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 61ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 62ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 63ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens resource->unlock(); 64ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 65ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 66ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DTexture9::QueryInterface(const IID &iid, void **object) 67ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 68ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 69ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 70ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 71ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 72ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(iid == IID_IDirect3DTexture9 || 73ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens iid == IID_IDirect3DBaseTexture9 || 74ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens iid == IID_IDirect3DResource9 || 75ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens iid == IID_IUnknown) 76ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 77ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens AddRef(); 78ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens *object = this; 79ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 80ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return S_OK; 81ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 82ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 83ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens *object = 0; 84ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 85ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return NOINTERFACE(iid); 86ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 87ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 88ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens unsigned long Direct3DTexture9::AddRef() 89ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 90ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 91ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 92ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::AddRef(); 93ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 94ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 95ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens unsigned long Direct3DTexture9::Release() 96ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 97ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 98ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 99ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::Release(); 100ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 101ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 102ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DTexture9::FreePrivateData(const GUID &guid) 103ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 104ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 105ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 106ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 107ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 108ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::FreePrivateData(guid); 109ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 110ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 111ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DTexture9::GetPrivateData(const GUID &guid, void *data, unsigned long *size) 112ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 113ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 114ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 115ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 116ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 117ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::GetPrivateData(guid, data, size); 118ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 119ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 120ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens void Direct3DTexture9::PreLoad() 121ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 122ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 123ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 124ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 125ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 126ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens Direct3DBaseTexture9::PreLoad(); 127ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 128ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 129ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DTexture9::SetPrivateData(const GUID &guid, const void *data, unsigned long size, unsigned long flags) 130ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 131ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 132ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 133ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 134ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 135ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::SetPrivateData(guid, data, size, flags); 136ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 137ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 138ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DTexture9::GetDevice(IDirect3DDevice9 **device) 139ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 140ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(this->device); 141ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 142ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE("IDirect3DDevice9 **device = 0x%0.8p", device); 143ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 144ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::GetDevice(device); 145ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 146ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 147ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens unsigned long Direct3DTexture9::SetPriority(unsigned long newPriority) 148ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 149ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 150ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 151ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE("unsigned long newPriority = %d", newPriority); 152ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 153ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::SetPriority(newPriority); 154ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 155ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 156ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens unsigned long Direct3DTexture9::GetPriority() 157ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 158ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 159ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 160ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 161ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 162ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::GetPriority(); 163ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 164ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 165ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens D3DRESOURCETYPE Direct3DTexture9::GetType() 166ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 167ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 168ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 169ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 170ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 171ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::GetType(); 172ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 173ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 174ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens void Direct3DTexture9::GenerateMipSubLevels() 175ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 176ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 177ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 178ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 179ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 180ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(!(usage & D3DUSAGE_AUTOGENMIPMAP) || !surfaceLevel[0]->hasDirtyMipmaps()) 181ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 182ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return; 183ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 184ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 185ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens resource->lock(sw::PUBLIC); 186ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 187ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens for(unsigned int i = 0; i < levels - 1; i++) 188ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 189ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens device->stretchRect(surfaceLevel[i], 0, surfaceLevel[i + 1], 0, GetAutoGenFilterType()); 190ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 191ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 192ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens surfaceLevel[0]->cleanMipmaps(); 193ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 194ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens resource->unlock(); 195ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 196ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 197ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens D3DTEXTUREFILTERTYPE Direct3DTexture9::GetAutoGenFilterType() 198ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 199ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 200ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 201ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 202ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 203ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::GetAutoGenFilterType(); 204ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 205ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 206ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens unsigned long Direct3DTexture9::GetLevelCount() 207ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 208ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 209ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 210ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 211ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 212ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::GetLevelCount(); 213ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 214ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 215ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens unsigned long Direct3DTexture9::GetLOD() 216ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 217ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 218ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 219ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 220ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 221ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::GetLOD(); 222ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 223ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 224ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DTexture9::SetAutoGenFilterType(D3DTEXTUREFILTERTYPE filterType) 225ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 226ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 227ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 228ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE("D3DTEXTUREFILTERTYPE filterType = %d", filterType); 229ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 230ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::SetAutoGenFilterType(filterType); 231ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 232ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 233ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens unsigned long Direct3DTexture9::SetLOD(unsigned long newLOD) 234ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 235ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 236ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 237ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE("unsigned long newLOD = %d", newLOD); 238ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 239ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::SetLOD(newLOD); 240ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 241ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 242ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DTexture9::GetLevelDesc(unsigned int level, D3DSURFACE_DESC *description) 243ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 244ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 245ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 246ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE("unsigned int level = %d, D3DSURFACE_DESC *description = 0x%0.8p", level, description); 247ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 248ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(!description || level >= GetLevelCount() || !surfaceLevel[level]) 249ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 250ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return INVALIDCALL(); 251ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 252ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 253ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return surfaceLevel[level]->GetDesc(description); 254ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 255ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 256ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DTexture9::LockRect(unsigned int level, D3DLOCKED_RECT *lockedRect, const RECT *rect, unsigned long flags) 257ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 258ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 259ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 260ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE("unsigned int level = %d, D3DLOCKED_RECT *lockedRect = 0x%0.8p, const RECT *rect = 0x%0.8p, unsigned long flags = %d", level, lockedRect, rect, flags); 261ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 262ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(!lockedRect || level >= GetLevelCount() || !surfaceLevel[level]) 263ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 264ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return INVALIDCALL(); 265ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 266ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 267ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return surfaceLevel[level]->LockRect(lockedRect, rect, flags); 268ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 269ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 270ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DTexture9::GetSurfaceLevel(unsigned int level, IDirect3DSurface9 **surface) 271ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 272ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 273ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 274ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE("unsigned int level = %d, IDirect3DSurface9 **surface = 0x%0.8p", level, surface); 275ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 276ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens *surface = 0; 277ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 278ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(level >= GetLevelCount() || !surfaceLevel[level]) 279ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 280ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return INVALIDCALL(); 281ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 282ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 283ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens surfaceLevel[level]->AddRef(); 284ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens *surface = surfaceLevel[level]; 285ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 286ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return D3D_OK; 287d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } 288ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 289ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DTexture9::UnlockRect(unsigned int level) 290ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 291ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 292ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 293ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE("unsigned int level = %d", level); 294ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 295ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(level >= GetLevelCount() || !surfaceLevel[level]) 296ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 297ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return INVALIDCALL(); 298ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 299ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 300ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return surfaceLevel[level]->UnlockRect(); 301ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 302ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 303ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DTexture9::AddDirtyRect(const RECT *dirtyRect) 304ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 305ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 306ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 307ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 308ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 309ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens // UNIMPLEMENTED(); 310ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 311ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return D3D_OK; 312ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 313ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 314ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens Direct3DSurface9 *Direct3DTexture9::getInternalSurfaceLevel(unsigned int level) 315ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 316ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return surfaceLevel[level]; 317ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 318ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens} 319