10bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens// 30bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Licensed under the Apache License, Version 2.0 (the "License"); 40bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// you may not use this file except in compliance with the License. 50bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// You may obtain a copy of the License at 6ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens// 70bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 8ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens// 90bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Unless required by applicable law or agreed to in writing, software 100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// distributed under the License is distributed on an "AS IS" BASIS, 110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// See the License for the specific language governing permissions and 130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// limitations under the License. 14ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 15ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens#include "Direct3DVolumeTexture9.hpp" 16ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 17ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens#include "Direct3DVolume9.hpp" 18ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens#include "Direct3DDevice9.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 Direct3DVolumeTexture9::Direct3DVolumeTexture9(Direct3DDevice9 *device, unsigned int width, unsigned int height, unsigned int depth, unsigned int levels, unsigned long usage, D3DFORMAT format, D3DPOOL pool) : Direct3DBaseTexture9(device, D3DRTYPE_VOLUMETEXTURE, format, pool, levels, usage), width(width), height(height), depth(depth) 27ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 28ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(levels == 0) 29ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 30ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens this->levels = sw::log2(sw::max((int)width, (int)height, (int)depth, 1)) + 1; 31ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 32ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 33b663f717768cbea51891c19ad61d2875d786efb6Nicolas Capens for(unsigned int level = 0; level < sw::MIPMAP_LEVELS; level++) 34ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 35ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(level < this->levels) 36ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 37ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens volumeLevel[level] = new Direct3DVolume9(device, this, width, height, depth, format, pool, usage); 38ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens volumeLevel[level]->bind(); 39ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 40ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens else 41ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 42ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens volumeLevel[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 depth = sw::max(1, (int)depth / 2); 48ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 49ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 50ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 51ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens Direct3DVolumeTexture9::~Direct3DVolumeTexture9() 52ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 53b663f717768cbea51891c19ad61d2875d786efb6Nicolas Capens for(int level = 0; level < sw::MIPMAP_LEVELS; level++) 54ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 55ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(volumeLevel[level]) 56ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 57ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens volumeLevel[level]->unbind(); 58ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens volumeLevel[level] = 0; 59ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 60ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 61ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 62ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 63ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DVolumeTexture9::QueryInterface(const IID &iid, void **object) 64ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 65ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 66ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 67ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 68ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 69ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(iid == IID_IDirect3DVolumeTexture9 || 70ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens iid == IID_IDirect3DBaseTexture9 || 71ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens iid == IID_IDirect3DResource9 || 72ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens iid == IID_IUnknown) 73ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 74ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens AddRef(); 75ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens *object = this; 76ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 77ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return S_OK; 78ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 79ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 80ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens *object = 0; 81ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 82ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return NOINTERFACE(iid); 83ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 84ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 85ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens unsigned long Direct3DVolumeTexture9::AddRef() 86ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 87ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 88ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 89ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::AddRef(); 90ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 91ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 92ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens unsigned long Direct3DVolumeTexture9::Release() 93ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 94ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 95ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 96ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::Release(); 97ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 98ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 99ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DVolumeTexture9::FreePrivateData(const GUID &guid) 100ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 101ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 102ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 103ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 104ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 105ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::FreePrivateData(guid); 106ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 107ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 108ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DVolumeTexture9::GetPrivateData(const GUID &guid, void *data, unsigned long *size) 109ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 110ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 111ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 112ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 113ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 114ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::GetPrivateData(guid, data, size); 115ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 116ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 117ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens void Direct3DVolumeTexture9::PreLoad() 118ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 119ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 120ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 121ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 122ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 123ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens Direct3DBaseTexture9::PreLoad(); 124ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 125ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 126ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DVolumeTexture9::SetPrivateData(const GUID &guid, const void *data, unsigned long size, unsigned long flags) 127ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 128ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 129ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 130ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 131ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 132ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::SetPrivateData(guid, data, size, flags); 133ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 134ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 135ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DVolumeTexture9::GetDevice(IDirect3DDevice9 **device) 136ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 137ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection(this->device); 138ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 139ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 140ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 141ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::GetDevice(device); 142ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 143ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 144ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens unsigned long Direct3DVolumeTexture9::SetPriority(unsigned long newPriority) 145ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 146ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 147ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 148ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 149ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 150ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::SetPriority(newPriority); 151ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 152ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 153ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens unsigned long Direct3DVolumeTexture9::GetPriority() 154ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 155ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 156ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 157ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 158ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 159ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::GetPriority(); 160ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 161ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 162ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens D3DRESOURCETYPE Direct3DVolumeTexture9::GetType() 163ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 164ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 165ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 166ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 167ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 168ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::GetType(); 169ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 170ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 171ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens void Direct3DVolumeTexture9::GenerateMipSubLevels() 172ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 173ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 174ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 175ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 176ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 17773e18c1b726b4b510e703715772f72450d9f8477Nicolas Capens if(!(usage & D3DUSAGE_AUTOGENMIPMAP) || !volumeLevel[0]->hasDirtyContents()) 178ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 179ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return; 180ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 181ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 182ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens resource->lock(sw::PUBLIC); 183ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 184ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens for(unsigned int i = 0; i < levels - 1; i++) 185ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 186ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens Direct3DVolume9 *source = volumeLevel[i]; 187ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens Direct3DVolume9 *dest = volumeLevel[i + 1]; 188ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 189ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens source->lockInternal(0, 0, 0, sw::LOCK_READONLY, sw::PUBLIC); 190ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens dest->lockInternal(0, 0, 0, sw::LOCK_DISCARD, sw::PUBLIC); 191ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 19266839438a7ed306493ed2b8721d197cd3663c67aNicolas Capens int sWidth = source->getWidth(); 19366839438a7ed306493ed2b8721d197cd3663c67aNicolas Capens int sHeight = source->getHeight(); 19466839438a7ed306493ed2b8721d197cd3663c67aNicolas Capens int sDepth = source->getDepth(); 195ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 19666839438a7ed306493ed2b8721d197cd3663c67aNicolas Capens int dWidth = dest->getWidth(); 19766839438a7ed306493ed2b8721d197cd3663c67aNicolas Capens int dHeight = dest->getHeight(); 19866839438a7ed306493ed2b8721d197cd3663c67aNicolas Capens int dDepth = dest->getDepth(); 199ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 200ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens D3DTEXTUREFILTERTYPE filter = GetAutoGenFilterType(); 201ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 202ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens float w = (float)sWidth / (float)dWidth; 203ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens float h = (float)sHeight / (float)dHeight; 204ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens float d = (float)sDepth / (float)dDepth; 205ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 206ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens float z = 0.5f * d; 207ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 208ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens for(int k = 0; k < dDepth; k++) 209ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 210ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens float y = 0.5f * h; 211ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 212ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens for(int j = 0; j < dHeight; j++) 213ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 214ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens float x = 0.5f * w; 215ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 216ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens for(int i = 0; i < dWidth; i++) 217ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 21843577b8cc676a157ceab055ead33a441c23b2cf5Alexis Hetu dest->copyInternal(source, i, j, k, x, y, z, filter > D3DTEXF_POINT); 219ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 220ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens x += w; 221ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 222ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 223ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens y += h; 224ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 225ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 226ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens z += d; 227ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 228ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 229ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens source->unlockInternal(); 230ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens dest->unlockInternal(); 231ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 232ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 23373e18c1b726b4b510e703715772f72450d9f8477Nicolas Capens volumeLevel[0]->markContentsClean(); 234ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 235ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens resource->unlock(); 236ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 237ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 238ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens D3DTEXTUREFILTERTYPE Direct3DVolumeTexture9::GetAutoGenFilterType() 239ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 240ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 241ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 242ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 243ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 244ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::GetAutoGenFilterType(); 245ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 246ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 247ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens unsigned long Direct3DVolumeTexture9::GetLevelCount() 248ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 249ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 250ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 251ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 252ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 253ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::GetLevelCount(); 254ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 255ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 256ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens unsigned long Direct3DVolumeTexture9::GetLOD() 257ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 258ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 259ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 260ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 261ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 262ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::GetLOD(); 263ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 264ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 265ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DVolumeTexture9::SetAutoGenFilterType(D3DTEXTUREFILTERTYPE filterType) 266ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 267ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 268ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 269ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 270ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 271ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::SetAutoGenFilterType(filterType); 272ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 273ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 274ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens unsigned long Direct3DVolumeTexture9::SetLOD(unsigned long newLOD) 275ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 276ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 277ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 278ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 279ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 280ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return Direct3DBaseTexture9::SetLOD(newLOD); 281ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 282ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 283ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DVolumeTexture9::GetVolumeLevel(unsigned int level, IDirect3DVolume9 **volume) 284ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 285ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 286ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 287ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 288ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 289ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens *volume = 0; 290ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 291ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(level >= GetLevelCount() || !volumeLevel[level]) 292ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 293ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return INVALIDCALL(); 294ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 295ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 296ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens volumeLevel[level]->AddRef(); 297ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens *volume = volumeLevel[level]; 298ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 299ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return D3D_OK; 300ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 301ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 302ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DVolumeTexture9::LockBox(unsigned int level, D3DLOCKED_BOX *lockedVolume, const D3DBOX *box, unsigned long flags) 303ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 304ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 305ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 306ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 307ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 308ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(!lockedVolume || level >= GetLevelCount() || !volumeLevel[level]) 309ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 310ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return INVALIDCALL(); 311ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 312ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 313ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return volumeLevel[level]->LockBox(lockedVolume, box, flags); 314ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 315ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 316ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DVolumeTexture9::UnlockBox(unsigned int level) 317ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 318ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 319ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 320ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 321ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 322ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(level >= GetLevelCount() || !volumeLevel[level]) 323ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 324ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return INVALIDCALL(); 325ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 326ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 327ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return volumeLevel[level]->UnlockBox(); 328ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 329ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 330ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DVolumeTexture9::AddDirtyBox(const D3DBOX *dirtyBox) 331ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 332ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 333ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 334ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 335ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 336ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens // UNIMPLEMENTED(); 337ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 338ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return D3D_OK; 339ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 340ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 341ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens long Direct3DVolumeTexture9::GetLevelDesc(unsigned int level, D3DVOLUME_DESC *description) 342ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 343ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens CriticalSection cs(device); 344ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 345ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens TRACE(""); 346ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 347ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens if(!description || level >= GetLevelCount() || !volumeLevel[level]) 348ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 349ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return INVALIDCALL(); 350ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 351ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 352ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return volumeLevel[level]->GetDesc(description); 353ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 354ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens 355ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens Direct3DVolume9 *Direct3DVolumeTexture9::getInternalVolumeLevel(unsigned int level) 356ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens { 357ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens return volumeLevel[level]; 358ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens } 359ee16f0de07d4b02a81c1c9ac716d631e67f487fcNicolas Capens} 360