blob: 41318b1b96abcc056544616eebdc6391cd4946c3 [file] [log] [blame]
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +00001//
2// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Renderer11.cpp: Implements a back-end specific class for the D3D11 renderer.
8
9#include "common/debug.h"
10#include "libGLESv2/utilities.h"
11#include "libGLESv2/renderer/Renderer11.h"
12
13#include "libEGL/Config.h"
14#include "libEGL/Display.h"
15
16namespace rx
17{
18
19Renderer11::Renderer11(egl::Display *display, HDC hDc) : Renderer(display), mDc(hDc)
20{
21 mD3d11Module = NULL;
22 mDxgiModule = NULL;
23
daniel@transgaming.com25072f62012-11-28 19:31:32 +000024 mDevice = NULL;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000025 mDeviceContext = NULL;
26}
27
28Renderer11::~Renderer11()
29{
30 releaseDeviceResources();
31
32 if (mDeviceContext)
33 {
34 mDeviceContext->Release();
35 mDeviceContext = NULL;
36 }
37
daniel@transgaming.com25072f62012-11-28 19:31:32 +000038 if (mDevice)
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000039 {
daniel@transgaming.com25072f62012-11-28 19:31:32 +000040 mDevice->Release();
41 mDevice = NULL;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000042 }
43
44 if (mD3d11Module)
45 {
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000046 FreeLibrary(mD3d11Module);
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000047 mD3d11Module = NULL;
48 }
49
50 if (mDxgiModule)
51 {
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000052 FreeLibrary(mDxgiModule);
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000053 mDxgiModule = NULL;
54 }
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000055}
56
57EGLint Renderer11::initialize()
58{
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000059 mDxgiModule = LoadLibrary(TEXT("dxgi.dll"));
60 mD3d11Module = LoadLibrary(TEXT("d3d11.dll"));
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000061
62 if (mD3d11Module == NULL || mDxgiModule == NULL)
63 {
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000064 ERR("Could not load D3D11 or DXGI library - aborting!\n");
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000065 return EGL_NOT_INITIALIZED;
66 }
67
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000068 PFN_D3D11_CREATE_DEVICE D3D11CreateDevice = (PFN_D3D11_CREATE_DEVICE)GetProcAddress(mD3d11Module, "D3D11CreateDevice");
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000069
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000070 if (D3D11CreateDevice == NULL)
71 {
72 ERR("Could not retrieve D3D11CreateDevice address - aborting!\n");
73 return EGL_NOT_INITIALIZED;
74 }
daniel@transgaming.com25072f62012-11-28 19:31:32 +000075
76 D3D_FEATURE_LEVEL featureLevel[] =
77 {
78 D3D_FEATURE_LEVEL_11_0,
79 D3D_FEATURE_LEVEL_10_1,
80 D3D_FEATURE_LEVEL_10_0,
81 };
82
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000083 HRESULT result = D3D11CreateDevice(NULL,
84 D3D_DRIVER_TYPE_HARDWARE,
85 NULL,
daniel@transgaming.com25072f62012-11-28 19:31:32 +000086 0, // D3D11_CREATE_DEVICE_DEBUG
87 featureLevel,
88 sizeof(featureLevel)/sizeof(featureLevel[0]),
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000089 D3D11_SDK_VERSION,
daniel@transgaming.com25072f62012-11-28 19:31:32 +000090 &mDevice,
91 &mFeatureLevel,
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000092 &mDeviceContext);
daniel@transgaming.com25072f62012-11-28 19:31:32 +000093
94 if (!mDevice || FAILED(result))
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000095 {
96 ERR("Could not create D3D11 device - aborting!\n");
97 return EGL_NOT_INITIALIZED; // Cleanup done by destructor through glDestroyRenderer
98 }
99
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000100 initializeDevice();
101
102 return EGL_SUCCESS;
103}
104
105// do any one-time device initialization
106// NOTE: this is also needed after a device lost/reset
107// to reset the scene status and ensure the default states are reset.
108void Renderer11::initializeDevice()
109{
110 // Permanent non-default states
111 // TODO
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000112 // UNIMPLEMENTED();
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000113}
114
115
116int Renderer11::generateConfigs(ConfigDesc **configDescList)
117{
118 // TODO
119 UNIMPLEMENTED();
120 return 0;
121}
122
123void Renderer11::deleteConfigs(ConfigDesc *configDescList)
124{
125 delete [] (configDescList);
126}
127
128void Renderer11::startScene()
129{
130 // TODO: nop in d3d11?
131}
132
133void Renderer11::endScene()
134{
135 // TODO: nop in d3d11?
136}
137
138void Renderer11::sync(bool block)
139{
140 // TODO
141 UNIMPLEMENTED();
142}
143
144void Renderer11::setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &samplerState)
145{
146 // TODO
147 UNIMPLEMENTED();
148}
149
150void Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *texture)
151{
152 // TODO
153 UNIMPLEMENTED();
154}
155
156
157void Renderer11::releaseDeviceResources()
158{
159 // TODO
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000160 // UNIMPLEMENTED();
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000161}
162
163void Renderer11::markDeviceLost()
164{
165 mDeviceLost = true;
166}
167
168bool Renderer11::isDeviceLost()
169{
170 return mDeviceLost;
171}
172
173// set notify to true to broadcast a message to all contexts of the device loss
174bool Renderer11::testDeviceLost(bool notify)
175{
176 bool isLost = false;
177
178 // TODO
179 UNIMPLEMENTED();
180
181 if (isLost)
182 {
183 // ensure we note the device loss --
184 // we'll probably get this done again by markDeviceLost
185 // but best to remember it!
186 // Note that we don't want to clear the device loss status here
187 // -- this needs to be done by resetDevice
188 mDeviceLost = true;
189 if (notify)
190 {
191 mDisplay->notifyDeviceLost();
192 }
193 }
194
195 return isLost;
196}
197
198bool Renderer11::testDeviceResettable()
199{
200 HRESULT status = D3D_OK;
201
202 // TODO
203 UNIMPLEMENTED();
204
205 switch (status)
206 {
207 case D3DERR_DEVICENOTRESET:
208 case D3DERR_DEVICEHUNG:
209 return true;
210 default:
211 return false;
212 }
213}
214
215bool Renderer11::resetDevice()
216{
217 releaseDeviceResources();
218
219 // TODO
220 UNIMPLEMENTED();
221
222 // reset device defaults
223 initializeDevice();
224 mDeviceLost = false;
225
226 return true;
227}
228
229DWORD Renderer11::getAdapterVendor() const
230{
231 // TODO
232 UNIMPLEMENTED();
233 return 0;
234}
235
236const char *Renderer11::getAdapterDescription() const
237{
238 // TODO
239 UNIMPLEMENTED();
240 return "UNIMPLEMENTED";
241}
242
243GUID Renderer11::getAdapterIdentifier() const
244{
245 // TODO
246 UNIMPLEMENTED();
247 GUID foo = {};
248 return foo;
249}
250
251bool Renderer11::getDXT1TextureSupport()
252{
253 // TODO
254 UNIMPLEMENTED();
255 return false;
256}
257
258bool Renderer11::getDXT3TextureSupport()
259{
260 // TODO
261 UNIMPLEMENTED();
262 return false;
263}
264
265bool Renderer11::getDXT5TextureSupport()
266{
267 // TODO
268 UNIMPLEMENTED();
269 return false;
270}
271
272bool Renderer11::getDepthTextureSupport() const
273{
274 // TODO
275 UNIMPLEMENTED();
276 return false;
277}
278
279bool Renderer11::getFloat32TextureSupport(bool *filtering, bool *renderable)
280{
281 // TODO
282 UNIMPLEMENTED();
283
284 *filtering = false;
285 *renderable = false;
286 return false;
287}
288
289bool Renderer11::getFloat16TextureSupport(bool *filtering, bool *renderable)
290{
291 // TODO
292 UNIMPLEMENTED();
293
294 *filtering = false;
295 *renderable = false;
296 return false;
297}
298
299bool Renderer11::getLuminanceTextureSupport()
300{
301 // TODO
302 UNIMPLEMENTED();
303 return false;
304}
305
306bool Renderer11::getLuminanceAlphaTextureSupport()
307{
308 // TODO
309 UNIMPLEMENTED();
310 return false;
311}
312
313bool Renderer11::getTextureFilterAnisotropySupport() const
314{
315 // TODO
316 UNIMPLEMENTED();
317 return false;
318}
319
320float Renderer11::getTextureMaxAnisotropy() const
321{
322 // TODO
323 UNIMPLEMENTED();
324 return 1.0f;
325}
326
327bool Renderer11::getEventQuerySupport()
328{
329 // TODO
330 UNIMPLEMENTED();
331 return false;
332}
333
334bool Renderer11::getVertexTextureSupport() const
335{
336 // TODO
337 UNIMPLEMENTED();
338 return false;
339}
340
341bool Renderer11::getNonPower2TextureSupport() const
342{
343 // TODO
344 UNIMPLEMENTED();
345 return false;
346}
347
348bool Renderer11::getOcclusionQuerySupport() const
349{
350 // TODO
351 UNIMPLEMENTED();
352 return false;
353}
354
355bool Renderer11::getInstancingSupport() const
356{
357 // TODO
358 UNIMPLEMENTED();
359 return false;
360}
361
362bool Renderer11::getShareHandleSupport() const
363{
364 // TODO
365 UNIMPLEMENTED();
366
367 // PIX doesn't seem to support using share handles, so disable them.
368 return false && !gl::perfActive();
369}
370
371bool Renderer11::getShaderModel3Support() const
372{
373 // TODO
374 UNIMPLEMENTED();
375 return true;
376}
377
378float Renderer11::getMaxPointSize() const
379{
380 // TODO
381 UNIMPLEMENTED();
382 return 1.0f;
383}
384
385int Renderer11::getMaxTextureWidth() const
386{
daniel@transgaming.com25072f62012-11-28 19:31:32 +0000387 switch (mFeatureLevel)
388 {
389 case D3D_FEATURE_LEVEL_11_0: return D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION; // 16384
390 case D3D_FEATURE_LEVEL_10_1:
391 case D3D_FEATURE_LEVEL_10_0: return D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION; // 8192
392 default: UNREACHABLE(); return 0;
393 }
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000394}
395
396int Renderer11::getMaxTextureHeight() const
397{
daniel@transgaming.com25072f62012-11-28 19:31:32 +0000398 switch (mFeatureLevel)
399 {
400 case D3D_FEATURE_LEVEL_11_0: return D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION; // 16384
401 case D3D_FEATURE_LEVEL_10_1:
402 case D3D_FEATURE_LEVEL_10_0: return D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION; // 8192
403 default: UNREACHABLE(); return 0;
404 }
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000405}
406
407bool Renderer11::get32BitIndexSupport() const
408{
daniel@transgaming.com25072f62012-11-28 19:31:32 +0000409 switch (mFeatureLevel)
410 {
411 case D3D_FEATURE_LEVEL_11_0:
412 case D3D_FEATURE_LEVEL_10_1:
413 case D3D_FEATURE_LEVEL_10_0: return D3D10_REQ_DRAWINDEXED_INDEX_COUNT_2_TO_EXP >= 32; // true
414 default: UNREACHABLE(); return false;
415 }
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000416}
417
418int Renderer11::getMinSwapInterval() const
419{
420 // TODO
421 UNIMPLEMENTED();
422 return 1;
423}
424
425int Renderer11::getMaxSwapInterval() const
426{
427 // TODO
428 UNIMPLEMENTED();
429 return 1;
430}
431
432int Renderer11::getMaxSupportedSamples() const
433{
434 // TODO
435 UNIMPLEMENTED();
436 return 1;
437}
438
daniel@transgaming.comad6aee72012-11-28 19:33:42 +0000439bool Renderer11::copyToRenderTarget(gl::TextureStorage2D *dest, gl::TextureStorage2D *source)
440{
441 // TODO
442 UNIMPLEMENTED();
443 return false;
444}
445
446bool Renderer11::copyToRenderTarget(gl::TextureStorageCubeMap *dest, gl::TextureStorageCubeMap *source)
447{
448 // TODO
449 UNIMPLEMENTED();
450 return false;
451}
452
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000453}