blob: 35ed122d96211faaa11d77b921427f7eb538a8e6 [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"
daniel@transgaming.comdcf1e672012-11-28 19:38:19 +000011#include "libGLESv2/mathutil.h"
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000012#include "libGLESv2/renderer/Renderer11.h"
daniel@transgaming.com65e65372012-11-28 19:33:50 +000013#include "libGLESv2/renderer/renderer11_utils.h"
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000014
15#include "libEGL/Config.h"
16#include "libEGL/Display.h"
17
18namespace rx
19{
daniel@transgaming.com65e65372012-11-28 19:33:50 +000020static const DXGI_FORMAT RenderTargetFormats[] =
21 {
22 DXGI_FORMAT_R8G8B8A8_UNORM
23 };
24
25static const DXGI_FORMAT DepthStencilFormats[] =
26 {
27 DXGI_FORMAT_D24_UNORM_S8_UINT
28 };
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000029
30Renderer11::Renderer11(egl::Display *display, HDC hDc) : Renderer(display), mDc(hDc)
31{
32 mD3d11Module = NULL;
33 mDxgiModule = NULL;
34
daniel@transgaming.comb9bb2792012-11-28 19:36:49 +000035 mDeviceLost = false;
36
daniel@transgaming.com25072f62012-11-28 19:31:32 +000037 mDevice = NULL;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000038 mDeviceContext = NULL;
daniel@transgaming.com65e65372012-11-28 19:33:50 +000039 mDxgiAdapter = NULL;
40 mDxgiFactory = NULL;
daniel@transgaming.comf8ba1092012-11-28 19:37:53 +000041
42 mForceSetBlendState = true;
daniel@transgaming.comdcf1e672012-11-28 19:38:19 +000043 mForceSetRasterState = true;
44 mForceSetScissor = true;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000045}
46
47Renderer11::~Renderer11()
48{
49 releaseDeviceResources();
50
daniel@transgaming.com65e65372012-11-28 19:33:50 +000051 if (mDxgiFactory)
52 {
53 mDxgiFactory->Release();
54 mDxgiFactory = NULL;
55 }
56
57 if (mDxgiAdapter)
58 {
59 mDxgiAdapter->Release();
60 mDxgiAdapter = NULL;
61 }
62
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000063 if (mDeviceContext)
64 {
65 mDeviceContext->Release();
66 mDeviceContext = NULL;
67 }
68
daniel@transgaming.com25072f62012-11-28 19:31:32 +000069 if (mDevice)
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000070 {
daniel@transgaming.com25072f62012-11-28 19:31:32 +000071 mDevice->Release();
72 mDevice = NULL;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000073 }
74
75 if (mD3d11Module)
76 {
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000077 FreeLibrary(mD3d11Module);
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000078 mD3d11Module = NULL;
79 }
80
81 if (mDxgiModule)
82 {
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000083 FreeLibrary(mDxgiModule);
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000084 mDxgiModule = NULL;
85 }
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000086}
87
88EGLint Renderer11::initialize()
89{
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000090 mDxgiModule = LoadLibrary(TEXT("dxgi.dll"));
91 mD3d11Module = LoadLibrary(TEXT("d3d11.dll"));
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000092
93 if (mD3d11Module == NULL || mDxgiModule == NULL)
94 {
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000095 ERR("Could not load D3D11 or DXGI library - aborting!\n");
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000096 return EGL_NOT_INITIALIZED;
97 }
98
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000099 PFN_D3D11_CREATE_DEVICE D3D11CreateDevice = (PFN_D3D11_CREATE_DEVICE)GetProcAddress(mD3d11Module, "D3D11CreateDevice");
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000100
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000101 if (D3D11CreateDevice == NULL)
102 {
103 ERR("Could not retrieve D3D11CreateDevice address - aborting!\n");
104 return EGL_NOT_INITIALIZED;
105 }
daniel@transgaming.com25072f62012-11-28 19:31:32 +0000106
107 D3D_FEATURE_LEVEL featureLevel[] =
108 {
109 D3D_FEATURE_LEVEL_11_0,
110 D3D_FEATURE_LEVEL_10_1,
111 D3D_FEATURE_LEVEL_10_0,
112 };
113
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000114 HRESULT result = D3D11CreateDevice(NULL,
115 D3D_DRIVER_TYPE_HARDWARE,
116 NULL,
daniel@transgaming.com25072f62012-11-28 19:31:32 +0000117 0, // D3D11_CREATE_DEVICE_DEBUG
118 featureLevel,
119 sizeof(featureLevel)/sizeof(featureLevel[0]),
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000120 D3D11_SDK_VERSION,
daniel@transgaming.com25072f62012-11-28 19:31:32 +0000121 &mDevice,
122 &mFeatureLevel,
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000123 &mDeviceContext);
daniel@transgaming.com25072f62012-11-28 19:31:32 +0000124
125 if (!mDevice || FAILED(result))
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000126 {
127 ERR("Could not create D3D11 device - aborting!\n");
128 return EGL_NOT_INITIALIZED; // Cleanup done by destructor through glDestroyRenderer
129 }
daniel@transgaming.com65e65372012-11-28 19:33:50 +0000130
131 IDXGIDevice *dxgiDevice = NULL;
132 result = mDevice->QueryInterface(__uuidof(IDXGIDevice), (void**)&dxgiDevice);
133
134 if (FAILED(result))
135 {
136 ERR("Could not query DXGI device - aborting!\n");
137 return EGL_NOT_INITIALIZED;
138 }
139
140 result = dxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void**)&mDxgiAdapter);
141
142 if (FAILED(result))
143 {
144 ERR("Could not retrieve DXGI adapter - aborting!\n");
145 return EGL_NOT_INITIALIZED;
146 }
147
148 dxgiDevice->Release();
149
150 result = mDxgiAdapter->GetParent(__uuidof(IDXGIFactory), (void**)&mDxgiFactory);
151
152 if (!mDxgiFactory || FAILED(result))
153 {
154 ERR("Could not create DXGI factory - aborting!\n");
155 return EGL_NOT_INITIALIZED;
156 }
157
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000158 initializeDevice();
159
160 return EGL_SUCCESS;
161}
162
163// do any one-time device initialization
164// NOTE: this is also needed after a device lost/reset
165// to reset the scene status and ensure the default states are reset.
166void Renderer11::initializeDevice()
167{
daniel@transgaming.comf8ba1092012-11-28 19:37:53 +0000168 mStateCache.initialize(mDevice);
169
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000170 // Permanent non-default states
171 // TODO
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000172 // UNIMPLEMENTED();
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000173}
174
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000175int Renderer11::generateConfigs(ConfigDesc **configDescList)
176{
daniel@transgaming.com65e65372012-11-28 19:33:50 +0000177 int numRenderFormats = sizeof(RenderTargetFormats) / sizeof(RenderTargetFormats[0]);
178 int numDepthFormats = sizeof(DepthStencilFormats) / sizeof(DepthStencilFormats[0]);
179 (*configDescList) = new ConfigDesc[numRenderFormats * numDepthFormats];
180 int numConfigs = 0;
181
182 for (int formatIndex = 0; formatIndex < numRenderFormats; formatIndex++)
183 {
184 for (int depthStencilIndex = 0; depthStencilIndex < numDepthFormats; depthStencilIndex++)
185 {
186 DXGI_FORMAT renderTargetFormat = RenderTargetFormats[formatIndex];
187
188 UINT formatSupport = 0;
189 HRESULT result = mDevice->CheckFormatSupport(renderTargetFormat, &formatSupport);
190
191 if (SUCCEEDED(result) && (formatSupport & D3D11_FORMAT_SUPPORT_RENDER_TARGET))
192 {
193 DXGI_FORMAT depthStencilFormat = DepthStencilFormats[depthStencilIndex];
194
195 UINT formatSupport = 0;
196 HRESULT result = mDevice->CheckFormatSupport(depthStencilFormat, &formatSupport);
197
198 if (SUCCEEDED(result) && (formatSupport & D3D11_FORMAT_SUPPORT_DEPTH_STENCIL))
199 {
200 ConfigDesc newConfig;
201 newConfig.renderTargetFormat = d3d11_gl::ConvertBackBufferFormat(renderTargetFormat);
202 newConfig.depthStencilFormat = d3d11_gl::ConvertDepthStencilFormat(depthStencilFormat);
203 newConfig.multiSample = 0; // FIXME: enumerate multi-sampling
204 newConfig.fastConfig = true; // Assume all DX11 format conversions to be fast
205
206 (*configDescList)[numConfigs++] = newConfig;
207 }
208 }
209 }
210 }
211
212 return numConfigs;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000213}
214
215void Renderer11::deleteConfigs(ConfigDesc *configDescList)
216{
217 delete [] (configDescList);
218}
219
220void Renderer11::startScene()
221{
222 // TODO: nop in d3d11?
223}
224
225void Renderer11::endScene()
226{
227 // TODO: nop in d3d11?
228}
229
230void Renderer11::sync(bool block)
231{
232 // TODO
233 UNIMPLEMENTED();
234}
235
daniel@transgaming.comb9bb2792012-11-28 19:36:49 +0000236SwapChain *Renderer11::createSwapChain(HWND window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat)
237{
238 // TODO
239 UNIMPLEMENTED();
240
241 //return new rx::SwapChain(this, window, shareHandle, backBufferFormat, depthBufferFormat);
242
243 return NULL;
244}
245
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000246void Renderer11::setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &samplerState)
247{
248 // TODO
249 UNIMPLEMENTED();
250}
251
252void Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *texture)
253{
254 // TODO
255 UNIMPLEMENTED();
256}
257
daniel@transgaming.com493d4f82012-11-28 19:35:45 +0000258void Renderer11::setRasterizerState(const gl::RasterizerState &rasterState, unsigned int depthSize)
259{
daniel@transgaming.comdcf1e672012-11-28 19:38:19 +0000260 if (mForceSetRasterState ||
261 memcmp(&rasterState, &mCurRasterState, sizeof(gl::RasterizerState)) != 0 ||
262 depthSize != mCurDepthSize)
263 {
264 ID3D11RasterizerState *dxRasterState = mStateCache.getRasterizerState(rasterState, depthSize);
265 if (!dxRasterState)
266 {
267 ERR("NULL blend state returned by RenderStateCache::getRasterizerState, setting the "
268 "rasterizer state.");
269 }
270
271 mDeviceContext->RSSetState(dxRasterState);
272
273 if (dxRasterState)
274 {
275 dxRasterState->Release();
276 }
277 mCurRasterState = rasterState;
278 mCurDepthSize = depthSize;
279 }
280
281 mForceSetRasterState = false;
daniel@transgaming.com493d4f82012-11-28 19:35:45 +0000282}
283
284void Renderer11::setBlendState(const gl::BlendState &blendState, const gl::Color &blendColor,
285 unsigned int sampleMask)
286{
daniel@transgaming.comf8ba1092012-11-28 19:37:53 +0000287 if (mForceSetBlendState ||
288 memcmp(&blendState, &mCurBlendState, sizeof(gl::BlendState)) != 0 ||
289 memcmp(&blendColor, &mCurBlendColor, sizeof(gl::Color)) != 0 ||
290 sampleMask != mCurSampleMask)
291 {
292 ID3D11BlendState *dxBlendState = mStateCache.getBlendState(blendState);
293 if (!dxBlendState)
294 {
295 ERR("NULL blend state returned by RenderStateCache::getBlendState, setting the default "
296 "blend state.");
297 }
298
299 const float blendColors[] = { blendColor.red, blendColor.green, blendColor.blue, blendColor.alpha };
300 mDeviceContext->OMSetBlendState(dxBlendState, blendColors, sampleMask);
301
302 if (dxBlendState)
303 {
304 dxBlendState->Release();
305 }
306 mCurBlendState = blendState;
307 mCurBlendColor = blendColor;
308 mCurSampleMask = sampleMask;
309 }
310
311 mForceSetBlendState = false;
daniel@transgaming.com493d4f82012-11-28 19:35:45 +0000312}
313
314void Renderer11::setDepthStencilState(const gl::DepthStencilState &depthStencilState, bool frontFaceCCW,
315 unsigned int stencilSize)
316{
317 // TODO
318 UNIMPLEMENTED();
319}
320
321void Renderer11::setScissorRectangle(const gl::Rectangle& scissor, unsigned int renderTargetWidth,
322 unsigned int renderTargetHeight)
323{
daniel@transgaming.comdcf1e672012-11-28 19:38:19 +0000324 if (mForceSetScissor ||
325 renderTargetWidth != mCurRenderTargetWidth ||
326 renderTargetHeight != mCurRenderTargetHeight ||
327 memcmp(&scissor, &mCurScissor, sizeof(gl::Rectangle)) != 0)
328 {
329 D3D11_RECT rect;
330 rect.left = gl::clamp(scissor.x, 0, static_cast<int>(renderTargetWidth));
331 rect.top = gl::clamp(scissor.y, 0, static_cast<int>(renderTargetWidth));
332 rect.right = gl::clamp(scissor.x + scissor.width, 0, static_cast<int>(renderTargetWidth));
333 rect.bottom = gl::clamp(scissor.y + scissor.height, 0, static_cast<int>(renderTargetWidth));
334
335 mDeviceContext->RSSetScissorRects(1, &rect);
336
337 mCurScissor = scissor;
338 mCurRenderTargetWidth = renderTargetWidth;
339 mCurRenderTargetHeight = renderTargetHeight;
340 }
341
342 mForceSetScissor = false;
daniel@transgaming.com493d4f82012-11-28 19:35:45 +0000343}
344
345void Renderer11::applyRenderTarget(gl::Framebuffer *frameBuffer)
346{
347 // TODO
348 UNIMPLEMENTED();
daniel@transgaming.comdcf1e672012-11-28 19:38:19 +0000349
350 mForceSetScissor = true;
daniel@transgaming.com493d4f82012-11-28 19:35:45 +0000351}
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000352
daniel@transgaming.comd084c622012-11-28 19:36:05 +0000353void Renderer11::clear(GLbitfield mask, const gl::Color &colorClear, float depthClear, int stencilClear,
354 gl::Framebuffer *frameBuffer)
355{
356 // TODO
357 UNIMPLEMENTED();
358}
359
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000360void Renderer11::releaseDeviceResources()
361{
362 // TODO
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000363 // UNIMPLEMENTED();
daniel@transgaming.comf8ba1092012-11-28 19:37:53 +0000364 mStateCache.clear();
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000365}
366
367void Renderer11::markDeviceLost()
368{
369 mDeviceLost = true;
370}
371
372bool Renderer11::isDeviceLost()
373{
374 return mDeviceLost;
375}
376
377// set notify to true to broadcast a message to all contexts of the device loss
378bool Renderer11::testDeviceLost(bool notify)
379{
380 bool isLost = false;
381
382 // TODO
daniel@transgaming.comb9bb2792012-11-28 19:36:49 +0000383 //UNIMPLEMENTED();
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000384
385 if (isLost)
386 {
387 // ensure we note the device loss --
388 // we'll probably get this done again by markDeviceLost
389 // but best to remember it!
390 // Note that we don't want to clear the device loss status here
391 // -- this needs to be done by resetDevice
392 mDeviceLost = true;
393 if (notify)
394 {
395 mDisplay->notifyDeviceLost();
396 }
397 }
398
399 return isLost;
400}
401
402bool Renderer11::testDeviceResettable()
403{
404 HRESULT status = D3D_OK;
405
406 // TODO
407 UNIMPLEMENTED();
408
409 switch (status)
410 {
411 case D3DERR_DEVICENOTRESET:
412 case D3DERR_DEVICEHUNG:
413 return true;
414 default:
415 return false;
416 }
417}
418
419bool Renderer11::resetDevice()
420{
421 releaseDeviceResources();
422
423 // TODO
424 UNIMPLEMENTED();
425
426 // reset device defaults
427 initializeDevice();
428 mDeviceLost = false;
429
daniel@transgaming.comf8ba1092012-11-28 19:37:53 +0000430 mForceSetBlendState = true;
daniel@transgaming.comdcf1e672012-11-28 19:38:19 +0000431 mForceSetRasterState = true;
432 mForceSetScissor = true;
daniel@transgaming.comf8ba1092012-11-28 19:37:53 +0000433
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000434 return true;
435}
436
437DWORD Renderer11::getAdapterVendor() const
438{
439 // TODO
440 UNIMPLEMENTED();
441 return 0;
442}
443
444const char *Renderer11::getAdapterDescription() const
445{
446 // TODO
447 UNIMPLEMENTED();
448 return "UNIMPLEMENTED";
449}
450
451GUID Renderer11::getAdapterIdentifier() const
452{
453 // TODO
454 UNIMPLEMENTED();
455 GUID foo = {};
456 return foo;
457}
458
459bool Renderer11::getDXT1TextureSupport()
460{
461 // TODO
462 UNIMPLEMENTED();
463 return false;
464}
465
466bool Renderer11::getDXT3TextureSupport()
467{
468 // TODO
469 UNIMPLEMENTED();
470 return false;
471}
472
473bool Renderer11::getDXT5TextureSupport()
474{
475 // TODO
476 UNIMPLEMENTED();
477 return false;
478}
479
480bool Renderer11::getDepthTextureSupport() const
481{
482 // TODO
483 UNIMPLEMENTED();
484 return false;
485}
486
487bool Renderer11::getFloat32TextureSupport(bool *filtering, bool *renderable)
488{
489 // TODO
490 UNIMPLEMENTED();
491
492 *filtering = false;
493 *renderable = false;
494 return false;
495}
496
497bool Renderer11::getFloat16TextureSupport(bool *filtering, bool *renderable)
498{
499 // TODO
500 UNIMPLEMENTED();
501
502 *filtering = false;
503 *renderable = false;
504 return false;
505}
506
507bool Renderer11::getLuminanceTextureSupport()
508{
509 // TODO
510 UNIMPLEMENTED();
511 return false;
512}
513
514bool Renderer11::getLuminanceAlphaTextureSupport()
515{
516 // TODO
517 UNIMPLEMENTED();
518 return false;
519}
520
521bool Renderer11::getTextureFilterAnisotropySupport() const
522{
523 // TODO
524 UNIMPLEMENTED();
525 return false;
526}
527
528float Renderer11::getTextureMaxAnisotropy() const
529{
530 // TODO
531 UNIMPLEMENTED();
532 return 1.0f;
533}
534
535bool Renderer11::getEventQuerySupport()
536{
537 // TODO
538 UNIMPLEMENTED();
539 return false;
540}
541
542bool Renderer11::getVertexTextureSupport() const
543{
544 // TODO
545 UNIMPLEMENTED();
546 return false;
547}
548
549bool Renderer11::getNonPower2TextureSupport() const
550{
551 // TODO
552 UNIMPLEMENTED();
553 return false;
554}
555
556bool Renderer11::getOcclusionQuerySupport() const
557{
558 // TODO
559 UNIMPLEMENTED();
560 return false;
561}
562
563bool Renderer11::getInstancingSupport() const
564{
565 // TODO
566 UNIMPLEMENTED();
567 return false;
568}
569
570bool Renderer11::getShareHandleSupport() const
571{
572 // TODO
daniel@transgaming.comb9bb2792012-11-28 19:36:49 +0000573 //UNIMPLEMENTED();
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000574
575 // PIX doesn't seem to support using share handles, so disable them.
576 return false && !gl::perfActive();
577}
578
579bool Renderer11::getShaderModel3Support() const
580{
581 // TODO
582 UNIMPLEMENTED();
583 return true;
584}
585
586float Renderer11::getMaxPointSize() const
587{
588 // TODO
589 UNIMPLEMENTED();
590 return 1.0f;
591}
592
593int Renderer11::getMaxTextureWidth() const
594{
daniel@transgaming.com25072f62012-11-28 19:31:32 +0000595 switch (mFeatureLevel)
596 {
597 case D3D_FEATURE_LEVEL_11_0: return D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION; // 16384
598 case D3D_FEATURE_LEVEL_10_1:
599 case D3D_FEATURE_LEVEL_10_0: return D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION; // 8192
600 default: UNREACHABLE(); return 0;
601 }
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000602}
603
604int Renderer11::getMaxTextureHeight() const
605{
daniel@transgaming.com25072f62012-11-28 19:31:32 +0000606 switch (mFeatureLevel)
607 {
608 case D3D_FEATURE_LEVEL_11_0: return D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION; // 16384
609 case D3D_FEATURE_LEVEL_10_1:
610 case D3D_FEATURE_LEVEL_10_0: return D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION; // 8192
611 default: UNREACHABLE(); return 0;
612 }
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000613}
614
615bool Renderer11::get32BitIndexSupport() const
616{
daniel@transgaming.com25072f62012-11-28 19:31:32 +0000617 switch (mFeatureLevel)
618 {
619 case D3D_FEATURE_LEVEL_11_0:
620 case D3D_FEATURE_LEVEL_10_1:
621 case D3D_FEATURE_LEVEL_10_0: return D3D10_REQ_DRAWINDEXED_INDEX_COUNT_2_TO_EXP >= 32; // true
622 default: UNREACHABLE(); return false;
623 }
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000624}
625
626int Renderer11::getMinSwapInterval() const
627{
daniel@transgaming.com8c7b1a92012-11-28 19:34:06 +0000628 return 0;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000629}
630
631int Renderer11::getMaxSwapInterval() const
632{
daniel@transgaming.com8c7b1a92012-11-28 19:34:06 +0000633 return 4;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000634}
635
636int Renderer11::getMaxSupportedSamples() const
637{
638 // TODO
639 UNIMPLEMENTED();
640 return 1;
641}
642
daniel@transgaming.com31b13e12012-11-28 19:34:30 +0000643bool Renderer11::copyToRenderTarget(TextureStorage2D *dest, TextureStorage2D *source)
daniel@transgaming.comad6aee72012-11-28 19:33:42 +0000644{
645 // TODO
646 UNIMPLEMENTED();
647 return false;
648}
649
daniel@transgaming.com31b13e12012-11-28 19:34:30 +0000650bool Renderer11::copyToRenderTarget(TextureStorageCubeMap *dest, TextureStorageCubeMap *source)
daniel@transgaming.comad6aee72012-11-28 19:33:42 +0000651{
652 // TODO
653 UNIMPLEMENTED();
654 return false;
655}
656
daniel@transgaming.com38380882012-11-28 19:36:39 +0000657bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat,
658 GLint xoffset, GLint yoffset, TextureStorage2D *storage, GLint level)
659{
660 // TODO
661 UNIMPLEMENTED();
662 return false;
663}
664
665bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat,
666 GLint xoffset, GLint yoffset, TextureStorageCubeMap *storage, GLenum target, GLint level)
667{
668 // TODO
669 UNIMPLEMENTED();
670 return false;
671}
672
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000673}