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