blob: ee26e256ebcbe566d2a083137839c557a43e10e2 [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
24 mD3d11 = NULL;
25 mDeviceContext = NULL;
26}
27
28Renderer11::~Renderer11()
29{
30 releaseDeviceResources();
31
32 if (mDeviceContext)
33 {
34 mDeviceContext->Release();
35 mDeviceContext = NULL;
36 }
37
38 if (mD3d11)
39 {
40 mD3d11->Release();
41 mD3d11 = NULL;
42 }
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 }
75
76 D3D_FEATURE_LEVEL featureLevel = D3D_FEATURE_LEVEL_10_0;
77
78 HRESULT result = D3D11CreateDevice(NULL,
79 D3D_DRIVER_TYPE_HARDWARE,
80 NULL,
81 NULL,
82 &featureLevel,
83 1,
84 D3D11_SDK_VERSION,
85 &mD3d11,
86 NULL,
87 &mDeviceContext);
88
89 if (!mD3d11 || FAILED(result))
90 {
91 ERR("Could not create D3D11 device - aborting!\n");
92 return EGL_NOT_INITIALIZED; // Cleanup done by destructor through glDestroyRenderer
93 }
94
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000095 initializeDevice();
96
97 return EGL_SUCCESS;
98}
99
100// do any one-time device initialization
101// NOTE: this is also needed after a device lost/reset
102// to reset the scene status and ensure the default states are reset.
103void Renderer11::initializeDevice()
104{
105 // Permanent non-default states
106 // TODO
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000107 // UNIMPLEMENTED();
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000108}
109
110
111int Renderer11::generateConfigs(ConfigDesc **configDescList)
112{
113 // TODO
114 UNIMPLEMENTED();
115 return 0;
116}
117
118void Renderer11::deleteConfigs(ConfigDesc *configDescList)
119{
120 delete [] (configDescList);
121}
122
123void Renderer11::startScene()
124{
125 // TODO: nop in d3d11?
126}
127
128void Renderer11::endScene()
129{
130 // TODO: nop in d3d11?
131}
132
133void Renderer11::sync(bool block)
134{
135 // TODO
136 UNIMPLEMENTED();
137}
138
139void Renderer11::setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &samplerState)
140{
141 // TODO
142 UNIMPLEMENTED();
143}
144
145void Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *texture)
146{
147 // TODO
148 UNIMPLEMENTED();
149}
150
151
152void Renderer11::releaseDeviceResources()
153{
154 // TODO
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000155 // UNIMPLEMENTED();
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000156}
157
158void Renderer11::markDeviceLost()
159{
160 mDeviceLost = true;
161}
162
163bool Renderer11::isDeviceLost()
164{
165 return mDeviceLost;
166}
167
168// set notify to true to broadcast a message to all contexts of the device loss
169bool Renderer11::testDeviceLost(bool notify)
170{
171 bool isLost = false;
172
173 // TODO
174 UNIMPLEMENTED();
175
176 if (isLost)
177 {
178 // ensure we note the device loss --
179 // we'll probably get this done again by markDeviceLost
180 // but best to remember it!
181 // Note that we don't want to clear the device loss status here
182 // -- this needs to be done by resetDevice
183 mDeviceLost = true;
184 if (notify)
185 {
186 mDisplay->notifyDeviceLost();
187 }
188 }
189
190 return isLost;
191}
192
193bool Renderer11::testDeviceResettable()
194{
195 HRESULT status = D3D_OK;
196
197 // TODO
198 UNIMPLEMENTED();
199
200 switch (status)
201 {
202 case D3DERR_DEVICENOTRESET:
203 case D3DERR_DEVICEHUNG:
204 return true;
205 default:
206 return false;
207 }
208}
209
210bool Renderer11::resetDevice()
211{
212 releaseDeviceResources();
213
214 // TODO
215 UNIMPLEMENTED();
216
217 // reset device defaults
218 initializeDevice();
219 mDeviceLost = false;
220
221 return true;
222}
223
224DWORD Renderer11::getAdapterVendor() const
225{
226 // TODO
227 UNIMPLEMENTED();
228 return 0;
229}
230
231const char *Renderer11::getAdapterDescription() const
232{
233 // TODO
234 UNIMPLEMENTED();
235 return "UNIMPLEMENTED";
236}
237
238GUID Renderer11::getAdapterIdentifier() const
239{
240 // TODO
241 UNIMPLEMENTED();
242 GUID foo = {};
243 return foo;
244}
245
246bool Renderer11::getDXT1TextureSupport()
247{
248 // TODO
249 UNIMPLEMENTED();
250 return false;
251}
252
253bool Renderer11::getDXT3TextureSupport()
254{
255 // TODO
256 UNIMPLEMENTED();
257 return false;
258}
259
260bool Renderer11::getDXT5TextureSupport()
261{
262 // TODO
263 UNIMPLEMENTED();
264 return false;
265}
266
267bool Renderer11::getDepthTextureSupport() const
268{
269 // TODO
270 UNIMPLEMENTED();
271 return false;
272}
273
274bool Renderer11::getFloat32TextureSupport(bool *filtering, bool *renderable)
275{
276 // TODO
277 UNIMPLEMENTED();
278
279 *filtering = false;
280 *renderable = false;
281 return false;
282}
283
284bool Renderer11::getFloat16TextureSupport(bool *filtering, bool *renderable)
285{
286 // TODO
287 UNIMPLEMENTED();
288
289 *filtering = false;
290 *renderable = false;
291 return false;
292}
293
294bool Renderer11::getLuminanceTextureSupport()
295{
296 // TODO
297 UNIMPLEMENTED();
298 return false;
299}
300
301bool Renderer11::getLuminanceAlphaTextureSupport()
302{
303 // TODO
304 UNIMPLEMENTED();
305 return false;
306}
307
308bool Renderer11::getTextureFilterAnisotropySupport() const
309{
310 // TODO
311 UNIMPLEMENTED();
312 return false;
313}
314
315float Renderer11::getTextureMaxAnisotropy() const
316{
317 // TODO
318 UNIMPLEMENTED();
319 return 1.0f;
320}
321
322bool Renderer11::getEventQuerySupport()
323{
324 // TODO
325 UNIMPLEMENTED();
326 return false;
327}
328
329bool Renderer11::getVertexTextureSupport() const
330{
331 // TODO
332 UNIMPLEMENTED();
333 return false;
334}
335
336bool Renderer11::getNonPower2TextureSupport() const
337{
338 // TODO
339 UNIMPLEMENTED();
340 return false;
341}
342
343bool Renderer11::getOcclusionQuerySupport() const
344{
345 // TODO
346 UNIMPLEMENTED();
347 return false;
348}
349
350bool Renderer11::getInstancingSupport() const
351{
352 // TODO
353 UNIMPLEMENTED();
354 return false;
355}
356
357bool Renderer11::getShareHandleSupport() const
358{
359 // TODO
360 UNIMPLEMENTED();
361
362 // PIX doesn't seem to support using share handles, so disable them.
363 return false && !gl::perfActive();
364}
365
366bool Renderer11::getShaderModel3Support() const
367{
368 // TODO
369 UNIMPLEMENTED();
370 return true;
371}
372
373float Renderer11::getMaxPointSize() const
374{
375 // TODO
376 UNIMPLEMENTED();
377 return 1.0f;
378}
379
380int Renderer11::getMaxTextureWidth() const
381{
382 // TODO
383 UNIMPLEMENTED();
384 return 1024;
385}
386
387int Renderer11::getMaxTextureHeight() const
388{
389 // TODO
390 UNIMPLEMENTED();
391 return 1024;
392}
393
394bool Renderer11::get32BitIndexSupport() const
395{
396 // TODO
397 UNIMPLEMENTED();
398 return true;
399}
400
401int Renderer11::getMinSwapInterval() const
402{
403 // TODO
404 UNIMPLEMENTED();
405 return 1;
406}
407
408int Renderer11::getMaxSwapInterval() const
409{
410 // TODO
411 UNIMPLEMENTED();
412 return 1;
413}
414
415int Renderer11::getMaxSupportedSamples() const
416{
417 // TODO
418 UNIMPLEMENTED();
419 return 1;
420}
421
422}