blob: e12b9b5d8425632905d831c8acf23600518dcf32 [file] [log] [blame]
Nicolas Capens17b29fd2016-09-15 09:32:16 -04001// 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 "Direct3DCubeTexture8.hpp"
16
17#include "Direct3DSurface8.hpp"
18#include "Resource.hpp"
19#include "Debug.hpp"
20
21#include <assert.h>
22
23namespace D3D8
24{
25 Direct3DCubeTexture8::Direct3DCubeTexture8(Direct3DDevice8 *device, unsigned int edgeLength, unsigned int levels, unsigned long usage, D3DFORMAT format, D3DPOOL pool) : Direct3DBaseTexture8(device, D3DRTYPE_CUBETEXTURE, levels, usage), edgeLength(edgeLength), format(format), pool(pool)
26 {
27 if(levels == 0)
28 {
29 this->levels = sw::log2(sw::max((int)edgeLength, 1)) + 1;
30 }
31
32 for(unsigned int face = 0; face < 6; face++)
33 {
34 int width = edgeLength;
35 int height = edgeLength;
36
37 for(unsigned int level = 0; level < sw::MIPMAP_LEVELS; level++)
38 {
39 if(level < this->levels)
Nicolas Capensbf7a8142017-05-19 10:57:28 -040040 {
Nicolas Capens17b29fd2016-09-15 09:32:16 -040041 surfaceLevel[face][level] = new Direct3DSurface8(device, this, width, height, format, pool, D3DMULTISAMPLE_NONE, true, usage);
42 surfaceLevel[face][level]->bind();
43 }
44 else
45 {
46 surfaceLevel[face][level] = 0;
47 }
48
49 width = sw::max(1, width / 2);
50 height = sw::max(1, height / 2);
51 }
52 }
53 }
54
55 Direct3DCubeTexture8::~Direct3DCubeTexture8()
56 {
Nicolas Capens17b29fd2016-09-15 09:32:16 -040057 for(unsigned int face = 0; face < 6; face++)
58 {
59 for(int level = 0; level < sw::MIPMAP_LEVELS; level++)
60 {
61 if(surfaceLevel[face][level])
62 {
63 surfaceLevel[face][level]->unbind();
64 surfaceLevel[face][level] = 0;
65 }
66 }
67 }
Nicolas Capens17b29fd2016-09-15 09:32:16 -040068 }
69
70 long Direct3DCubeTexture8::QueryInterface(const IID &iid, void **object)
71 {
72 TRACE("");
73
74 if(iid == IID_IDirect3DCubeTexture8 ||
75 iid == IID_IDirect3DBaseTexture8 ||
76 iid == IID_IDirect3DResource8 ||
77 iid == IID_IUnknown)
78 {
79 AddRef();
80 *object = this;
81
82 return S_OK;
83 }
84
85 *object = 0;
86
87 return NOINTERFACE(iid);
88 }
89
90 unsigned long Direct3DCubeTexture8::AddRef()
91 {
92 TRACE("");
93
94 return Direct3DBaseTexture8::AddRef();
95 }
96
97 unsigned long Direct3DCubeTexture8::Release()
98 {
99 TRACE("");
100
101 return Direct3DBaseTexture8::Release();
102 }
103
104 long Direct3DCubeTexture8::FreePrivateData(const GUID &guid)
105 {
106 TRACE("");
107
108 return Direct3DBaseTexture8::FreePrivateData(guid);
109 }
110
111 long Direct3DCubeTexture8::GetPrivateData(const GUID &guid, void *data, unsigned long *size)
112 {
113 TRACE("");
114
115 return Direct3DBaseTexture8::GetPrivateData(guid, data, size);
116 }
117
118 void Direct3DCubeTexture8::PreLoad()
119 {
120 TRACE("");
121
122 Direct3DBaseTexture8::PreLoad();
123 }
124
125 long Direct3DCubeTexture8::SetPrivateData(const GUID &guid, const void *data, unsigned long size, unsigned long flags)
126 {
127 TRACE("");
128
129 return Direct3DBaseTexture8::SetPrivateData(guid, data, size, flags);
130 }
131
132 long Direct3DCubeTexture8::GetDevice(IDirect3DDevice8 **device)
133 {
134 TRACE("");
135
136 return Direct3DBaseTexture8::GetDevice(device);
137 }
138
139 unsigned long Direct3DCubeTexture8::SetPriority(unsigned long newPriority)
140 {
141 TRACE("");
142
143 return Direct3DBaseTexture8::SetPriority(newPriority);
144 }
145
146 unsigned long Direct3DCubeTexture8::GetPriority()
147 {
148 TRACE("");
149
150 return Direct3DBaseTexture8::GetPriority();
151 }
152
153 D3DRESOURCETYPE Direct3DCubeTexture8::GetType()
154 {
155 TRACE("");
156
157 return Direct3DBaseTexture8::GetType();
158 }
159
160 unsigned long Direct3DCubeTexture8::GetLevelCount()
161 {
162 TRACE("");
163
164 return Direct3DBaseTexture8::GetLevelCount();
165 }
166
167 unsigned long Direct3DCubeTexture8::GetLOD()
168 {
169 TRACE("");
170
171 return Direct3DBaseTexture8::GetLOD();
172 }
173
174 unsigned long Direct3DCubeTexture8::SetLOD(unsigned long newLOD)
175 {
176 TRACE("");
177
178 return Direct3DBaseTexture8::SetLOD(newLOD);
179 }
180
181 long Direct3DCubeTexture8::AddDirtyRect(D3DCUBEMAP_FACES face, const RECT *dirtyRect)
182 {
183 TRACE("");
184
185 // UNIMPLEMENTED();
186
187 return D3D_OK;
188 }
189
190 long Direct3DCubeTexture8::GetCubeMapSurface(D3DCUBEMAP_FACES face, unsigned int level , IDirect3DSurface8 **cubeMapSurface)
191 {
192 TRACE("");
193
194 *cubeMapSurface = 0; // FIXME: Verify
195
196 if(face >= 6 || level >= GetLevelCount() || !surfaceLevel[face][level])
197 {
198 return INVALIDCALL();
199 }
200
201 surfaceLevel[face][level]->AddRef();
202 *cubeMapSurface = surfaceLevel[face][level];
203
204 return D3D_OK;
205 }
206
207 long Direct3DCubeTexture8::GetLevelDesc(unsigned int level, D3DSURFACE_DESC *description)
208 {
209 TRACE("");
210
211 if(!description || level >= GetLevelCount() || !surfaceLevel[0][level])
212 {
213 return INVALIDCALL();
214 }
215
216 surfaceLevel[0][level]->GetDesc(description);
217
218 return D3D_OK;
219 }
220
221 long Direct3DCubeTexture8::LockRect(D3DCUBEMAP_FACES face, unsigned int level, D3DLOCKED_RECT *lockedRect, const RECT *rect, unsigned long flags)
222 {
223 TRACE("");
224
225 if(!lockedRect || face >= 6 || level >= GetLevelCount() || !surfaceLevel[face][level])
226 {
227 return INVALIDCALL();
228 }
229
230 surfaceLevel[face][level]->LockRect(lockedRect, rect, flags);
231
232 return D3D_OK;
233 }
234
235 long Direct3DCubeTexture8::UnlockRect(D3DCUBEMAP_FACES face, unsigned int level)
236 {
237 TRACE("");
238
239 if(face >= 6 || level >= GetLevelCount() || !surfaceLevel[face][level])
240 {
241 return INVALIDCALL();
242 }
243
244 return surfaceLevel[face][level]->UnlockRect();
245 }
246
247 Direct3DSurface8 *Direct3DCubeTexture8::getInternalCubeMapSurface(D3DCUBEMAP_FACES face, unsigned int level)
248 {
249 return surfaceLevel[face][level];
250 }
251}