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 "Direct3DVolume8.hpp"
16 
17 #include "Direct3DResource8.hpp"
18 #include "Direct3DVolumeTexture8.hpp"
19 #include "Direct3DSurface8.hpp"
20 #include "Debug.hpp"
21 
22 #include <assert.h>
23 
24 namespace D3D8
25 {
Direct3DVolume8(Direct3DDevice8 * device,Direct3DVolumeTexture8 * container,int width,int height,int depth,D3DFORMAT format,D3DPOOL pool,bool lockable,unsigned long usage)26 	Direct3DVolume8::Direct3DVolume8(Direct3DDevice8 *device, Direct3DVolumeTexture8 *container, int width, int height, int depth, D3DFORMAT format, D3DPOOL pool, bool lockable, unsigned long usage)
27 		: Surface(container->getResource(), width, height, depth, 0, 1, translateFormat(format), lockable, false), container(container), width(width), height(height), depth(depth), format(format), pool(pool), lockable(lockable), usage(usage)
28 	{
29 		resource = new Direct3DResource8(device, D3DRTYPE_VOLUME, memoryUsage(width, height, depth, format));
30 	}
31 
~Direct3DVolume8()32 	Direct3DVolume8::~Direct3DVolume8()
33 	{
34 		resource->Release();
35 	}
36 
lockInternal(int x,int y,int z,sw::Lock lock,sw::Accessor client)37 	void *Direct3DVolume8::lockInternal(int x, int y, int z, sw::Lock lock, sw::Accessor client)
38 	{
39 		return Surface::lockInternal(x, y, z, lock, client);
40 	}
41 
unlockInternal()42 	void Direct3DVolume8::unlockInternal()
43 	{
44 		Surface::unlockInternal();
45 	}
46 
QueryInterface(const IID & iid,void ** object)47 	long __stdcall Direct3DVolume8::QueryInterface(const IID &iid, void **object)
48 	{
49 		TRACE("");
50 
51 		if(iid == IID_IDirect3DVolume8 ||
52 		   iid == IID_IUnknown)
53 		{
54 			AddRef();
55 			*object = this;
56 
57 			return S_OK;
58 		}
59 
60 		*object = 0;
61 
62 		return NOINTERFACE(iid);
63 	}
64 
AddRef()65 	unsigned long __stdcall Direct3DVolume8::AddRef()
66 	{
67 		TRACE("");
68 
69 		return container->AddRef();
70 	}
71 
Release()72 	unsigned long __stdcall Direct3DVolume8::Release()
73 	{
74 		TRACE("");
75 
76 		return container->Release();
77 	}
78 
FreePrivateData(const GUID & guid)79 	long Direct3DVolume8::FreePrivateData(const GUID &guid)
80 	{
81 		TRACE("");
82 
83 		return resource->FreePrivateData(guid);
84 	}
85 
GetContainer(const IID & iid,void ** container)86 	long Direct3DVolume8::GetContainer(const IID &iid, void **container)
87 	{
88 		TRACE("");
89 
90 		if(!container)
91 		{
92 			return INVALIDCALL();
93 		}
94 
95 		long result = this->container->QueryInterface(iid, container);
96 
97 		if(result == S_OK)
98 		{
99 			return D3D_OK;
100 		}
101 
102 		return INVALIDCALL();
103 	}
104 
GetDesc(D3DVOLUME_DESC * description)105 	long Direct3DVolume8::GetDesc(D3DVOLUME_DESC *description)
106 	{
107 		TRACE("");
108 
109 		if(!description)
110 		{
111 			return INVALIDCALL();
112 		}
113 
114 		description->Format = format;
115 		description->Type = D3DRTYPE_VOLUME;
116 		description->Usage = usage;
117 		description->Pool = pool;
118 		description->Width = width;
119 		description->Height = height;
120 		description->Depth = depth;
121 
122 		return D3D_OK;
123 	}
124 
GetDevice(IDirect3DDevice8 ** device)125 	long Direct3DVolume8::GetDevice(IDirect3DDevice8 **device)
126 	{
127 		TRACE("");
128 
129 		return resource->GetDevice(device);
130 	}
131 
GetPrivateData(const GUID & guid,void * data,unsigned long * size)132 	long Direct3DVolume8::GetPrivateData(const GUID &guid, void *data, unsigned long *size)
133 	{
134 		TRACE("");
135 
136 		return resource->GetPrivateData(guid, data, size);
137 	}
138 
LockBox(D3DLOCKED_BOX * lockedVolume,const D3DBOX * box,unsigned long flags)139 	long Direct3DVolume8::LockBox(D3DLOCKED_BOX *lockedVolume, const D3DBOX *box, unsigned long flags)
140 	{
141 		TRACE("");
142 
143 		if(!lockedVolume)
144 		{
145 			return INVALIDCALL();
146 		}
147 
148 		lockedVolume->RowPitch = pitchB(getWidth(), 0, getExternalFormat(), false);
149 		lockedVolume->SlicePitch = sliceB(getWidth(), getHeight(), 0, getExternalFormat(), false);
150 
151 		sw::Lock lock = sw::LOCK_READWRITE;
152 
153 		if(flags & D3DLOCK_DISCARD)
154 		{
155 			lock = sw::LOCK_DISCARD;
156 		}
157 
158 		if(flags & D3DLOCK_READONLY)
159 		{
160 			lock = sw::LOCK_READONLY;
161 		}
162 
163 		if(box)
164 		{
165 			lockedVolume->pBits = lockExternal(box->Left, box->Top, box->Front, lock, sw::PUBLIC);
166 		}
167 		else
168 		{
169 			lockedVolume->pBits = lockExternal(0, 0, 0, lock, sw::PUBLIC);
170 		}
171 
172 		unlockExternal();
173 
174 		return D3D_OK;
175 	}
176 
SetPrivateData(const GUID & guid,const void * data,unsigned long size,unsigned long flags)177 	long Direct3DVolume8::SetPrivateData(const GUID &guid, const void *data, unsigned long size, unsigned long flags)
178 	{
179 		TRACE("");
180 
181 		return SetPrivateData(guid, data, size, flags);
182 	}
183 
UnlockBox()184 	long Direct3DVolume8::UnlockBox()
185 	{
186 		TRACE("");
187 
188 		return D3D_OK;
189 	}
190 
translateFormat(D3DFORMAT format)191 	sw::Format Direct3DVolume8::translateFormat(D3DFORMAT format)
192 	{
193 		return Direct3DSurface8::translateFormat(format);
194 	}
195 
memoryUsage(int width,int height,int depth,D3DFORMAT format)196 	unsigned int Direct3DVolume8::memoryUsage(int width, int height, int depth, D3DFORMAT format)
197 	{
198 		return Surface::size(width, height, depth, 0, 1, translateFormat(format));
199 	}
200 }
201