blob: ab4047dac009a86a00494e8c7f7482e24870c4b5 [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"
daniel@transgaming.com5503fd02012-11-28 19:38:57 +000010#include "libGLESv2/main.h"
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000011#include "libGLESv2/utilities.h"
daniel@transgaming.comdcf1e672012-11-28 19:38:19 +000012#include "libGLESv2/mathutil.h"
daniel@transgaming.com53670042012-11-28 20:55:51 +000013#include "libGLESv2/Program.h"
14#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000015#include "libGLESv2/renderer/Renderer11.h"
daniel@transgaming.comb6b27bc2012-11-28 20:54:30 +000016#include "libGLESv2/renderer/RenderTarget11.h"
daniel@transgaming.com65e65372012-11-28 19:33:50 +000017#include "libGLESv2/renderer/renderer11_utils.h"
daniel@transgaming.coma60160b2012-11-28 19:41:15 +000018#include "libGLESv2/renderer/SwapChain11.h"
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000019
20#include "libEGL/Config.h"
21#include "libEGL/Display.h"
22
23namespace rx
24{
daniel@transgaming.com65e65372012-11-28 19:33:50 +000025static const DXGI_FORMAT RenderTargetFormats[] =
26 {
27 DXGI_FORMAT_R8G8B8A8_UNORM
28 };
29
30static const DXGI_FORMAT DepthStencilFormats[] =
31 {
32 DXGI_FORMAT_D24_UNORM_S8_UINT
33 };
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000034
35Renderer11::Renderer11(egl::Display *display, HDC hDc) : Renderer(display), mDc(hDc)
36{
37 mD3d11Module = NULL;
38 mDxgiModule = NULL;
39
daniel@transgaming.comb9bb2792012-11-28 19:36:49 +000040 mDeviceLost = false;
41
daniel@transgaming.com25072f62012-11-28 19:31:32 +000042 mDevice = NULL;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000043 mDeviceContext = NULL;
daniel@transgaming.com65e65372012-11-28 19:33:50 +000044 mDxgiAdapter = NULL;
45 mDxgiFactory = NULL;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000046}
47
48Renderer11::~Renderer11()
49{
50 releaseDeviceResources();
51
daniel@transgaming.com65e65372012-11-28 19:33:50 +000052 if (mDxgiFactory)
53 {
54 mDxgiFactory->Release();
55 mDxgiFactory = NULL;
56 }
57
58 if (mDxgiAdapter)
59 {
60 mDxgiAdapter->Release();
61 mDxgiAdapter = NULL;
62 }
63
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000064 if (mDeviceContext)
65 {
66 mDeviceContext->Release();
67 mDeviceContext = NULL;
68 }
69
daniel@transgaming.com25072f62012-11-28 19:31:32 +000070 if (mDevice)
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000071 {
daniel@transgaming.com25072f62012-11-28 19:31:32 +000072 mDevice->Release();
73 mDevice = NULL;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000074 }
75
76 if (mD3d11Module)
77 {
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000078 FreeLibrary(mD3d11Module);
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000079 mD3d11Module = NULL;
80 }
81
82 if (mDxgiModule)
83 {
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000084 FreeLibrary(mDxgiModule);
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000085 mDxgiModule = NULL;
86 }
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000087}
88
daniel@transgaming.comb64ed282012-11-28 20:54:02 +000089Renderer11 *Renderer11::makeRenderer11(Renderer *renderer)
90{
91 ASSERT(dynamic_cast<rx::Renderer11*>(renderer) != NULL);
92 return static_cast<rx::Renderer11*>(renderer);
93}
94
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000095EGLint Renderer11::initialize()
96{
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000097 mDxgiModule = LoadLibrary(TEXT("dxgi.dll"));
98 mD3d11Module = LoadLibrary(TEXT("d3d11.dll"));
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +000099
100 if (mD3d11Module == NULL || mDxgiModule == NULL)
101 {
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000102 ERR("Could not load D3D11 or DXGI library - aborting!\n");
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000103 return EGL_NOT_INITIALIZED;
104 }
105
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000106 PFN_D3D11_CREATE_DEVICE D3D11CreateDevice = (PFN_D3D11_CREATE_DEVICE)GetProcAddress(mD3d11Module, "D3D11CreateDevice");
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000107
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000108 if (D3D11CreateDevice == NULL)
109 {
110 ERR("Could not retrieve D3D11CreateDevice address - aborting!\n");
111 return EGL_NOT_INITIALIZED;
112 }
daniel@transgaming.com25072f62012-11-28 19:31:32 +0000113
114 D3D_FEATURE_LEVEL featureLevel[] =
115 {
116 D3D_FEATURE_LEVEL_11_0,
117 D3D_FEATURE_LEVEL_10_1,
118 D3D_FEATURE_LEVEL_10_0,
119 };
120
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000121 HRESULT result = D3D11CreateDevice(NULL,
122 D3D_DRIVER_TYPE_HARDWARE,
123 NULL,
daniel@transgaming.coma60160b2012-11-28 19:41:15 +0000124 #if defined(_DEBUG)
125 D3D11_CREATE_DEVICE_DEBUG,
126 #else
127 0,
128 #endif
daniel@transgaming.com25072f62012-11-28 19:31:32 +0000129 featureLevel,
130 sizeof(featureLevel)/sizeof(featureLevel[0]),
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000131 D3D11_SDK_VERSION,
daniel@transgaming.com25072f62012-11-28 19:31:32 +0000132 &mDevice,
133 &mFeatureLevel,
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000134 &mDeviceContext);
daniel@transgaming.com25072f62012-11-28 19:31:32 +0000135
136 if (!mDevice || FAILED(result))
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000137 {
138 ERR("Could not create D3D11 device - aborting!\n");
139 return EGL_NOT_INITIALIZED; // Cleanup done by destructor through glDestroyRenderer
140 }
daniel@transgaming.com65e65372012-11-28 19:33:50 +0000141
142 IDXGIDevice *dxgiDevice = NULL;
143 result = mDevice->QueryInterface(__uuidof(IDXGIDevice), (void**)&dxgiDevice);
144
145 if (FAILED(result))
146 {
147 ERR("Could not query DXGI device - aborting!\n");
148 return EGL_NOT_INITIALIZED;
149 }
150
151 result = dxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void**)&mDxgiAdapter);
152
153 if (FAILED(result))
154 {
155 ERR("Could not retrieve DXGI adapter - aborting!\n");
156 return EGL_NOT_INITIALIZED;
157 }
158
159 dxgiDevice->Release();
160
161 result = mDxgiAdapter->GetParent(__uuidof(IDXGIFactory), (void**)&mDxgiFactory);
162
163 if (!mDxgiFactory || FAILED(result))
164 {
165 ERR("Could not create DXGI factory - aborting!\n");
166 return EGL_NOT_INITIALIZED;
167 }
168
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000169 initializeDevice();
170
171 return EGL_SUCCESS;
172}
173
174// do any one-time device initialization
175// NOTE: this is also needed after a device lost/reset
176// to reset the scene status and ensure the default states are reset.
177void Renderer11::initializeDevice()
178{
daniel@transgaming.comf8ba1092012-11-28 19:37:53 +0000179 mStateCache.initialize(mDevice);
180
daniel@transgaming.comc43a6052012-11-28 19:41:51 +0000181 markAllStateDirty();
182
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000183 // Permanent non-default states
184 // TODO
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000185 // UNIMPLEMENTED();
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000186}
187
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000188int Renderer11::generateConfigs(ConfigDesc **configDescList)
189{
daniel@transgaming.come3e826d2012-11-28 19:42:35 +0000190 unsigned int numRenderFormats = sizeof(RenderTargetFormats) / sizeof(RenderTargetFormats[0]);
191 unsigned int numDepthFormats = sizeof(DepthStencilFormats) / sizeof(DepthStencilFormats[0]);
daniel@transgaming.com65e65372012-11-28 19:33:50 +0000192 (*configDescList) = new ConfigDesc[numRenderFormats * numDepthFormats];
193 int numConfigs = 0;
194
daniel@transgaming.come3e826d2012-11-28 19:42:35 +0000195 for (unsigned int formatIndex = 0; formatIndex < numRenderFormats; formatIndex++)
daniel@transgaming.com65e65372012-11-28 19:33:50 +0000196 {
daniel@transgaming.come3e826d2012-11-28 19:42:35 +0000197 for (unsigned int depthStencilIndex = 0; depthStencilIndex < numDepthFormats; depthStencilIndex++)
daniel@transgaming.com65e65372012-11-28 19:33:50 +0000198 {
199 DXGI_FORMAT renderTargetFormat = RenderTargetFormats[formatIndex];
200
201 UINT formatSupport = 0;
202 HRESULT result = mDevice->CheckFormatSupport(renderTargetFormat, &formatSupport);
203
204 if (SUCCEEDED(result) && (formatSupport & D3D11_FORMAT_SUPPORT_RENDER_TARGET))
205 {
206 DXGI_FORMAT depthStencilFormat = DepthStencilFormats[depthStencilIndex];
207
208 UINT formatSupport = 0;
209 HRESULT result = mDevice->CheckFormatSupport(depthStencilFormat, &formatSupport);
210
211 if (SUCCEEDED(result) && (formatSupport & D3D11_FORMAT_SUPPORT_DEPTH_STENCIL))
212 {
213 ConfigDesc newConfig;
214 newConfig.renderTargetFormat = d3d11_gl::ConvertBackBufferFormat(renderTargetFormat);
215 newConfig.depthStencilFormat = d3d11_gl::ConvertDepthStencilFormat(depthStencilFormat);
216 newConfig.multiSample = 0; // FIXME: enumerate multi-sampling
217 newConfig.fastConfig = true; // Assume all DX11 format conversions to be fast
218
219 (*configDescList)[numConfigs++] = newConfig;
220 }
221 }
222 }
223 }
224
225 return numConfigs;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000226}
227
228void Renderer11::deleteConfigs(ConfigDesc *configDescList)
229{
230 delete [] (configDescList);
231}
232
233void Renderer11::startScene()
234{
235 // TODO: nop in d3d11?
236}
237
238void Renderer11::endScene()
239{
240 // TODO: nop in d3d11?
241}
242
243void Renderer11::sync(bool block)
244{
245 // TODO
246 UNIMPLEMENTED();
247}
248
daniel@transgaming.comb9bb2792012-11-28 19:36:49 +0000249SwapChain *Renderer11::createSwapChain(HWND window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat)
250{
daniel@transgaming.coma60160b2012-11-28 19:41:15 +0000251 return new rx::SwapChain11(this, window, shareHandle, backBufferFormat, depthBufferFormat);
daniel@transgaming.comb9bb2792012-11-28 19:36:49 +0000252}
253
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000254void Renderer11::setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &samplerState)
255{
256 // TODO
257 UNIMPLEMENTED();
258}
259
260void Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *texture)
261{
262 // TODO
263 UNIMPLEMENTED();
264}
265
daniel@transgaming.com493d4f82012-11-28 19:35:45 +0000266void Renderer11::setRasterizerState(const gl::RasterizerState &rasterState, unsigned int depthSize)
267{
daniel@transgaming.comdcf1e672012-11-28 19:38:19 +0000268 if (mForceSetRasterState ||
269 memcmp(&rasterState, &mCurRasterState, sizeof(gl::RasterizerState)) != 0 ||
270 depthSize != mCurDepthSize)
271 {
272 ID3D11RasterizerState *dxRasterState = mStateCache.getRasterizerState(rasterState, depthSize);
273 if (!dxRasterState)
274 {
275 ERR("NULL blend state returned by RenderStateCache::getRasterizerState, setting the "
276 "rasterizer state.");
277 }
278
279 mDeviceContext->RSSetState(dxRasterState);
280
281 if (dxRasterState)
282 {
283 dxRasterState->Release();
284 }
285 mCurRasterState = rasterState;
286 mCurDepthSize = depthSize;
287 }
288
289 mForceSetRasterState = false;
daniel@transgaming.com493d4f82012-11-28 19:35:45 +0000290}
291
292void Renderer11::setBlendState(const gl::BlendState &blendState, const gl::Color &blendColor,
293 unsigned int sampleMask)
294{
daniel@transgaming.comf8ba1092012-11-28 19:37:53 +0000295 if (mForceSetBlendState ||
296 memcmp(&blendState, &mCurBlendState, sizeof(gl::BlendState)) != 0 ||
297 memcmp(&blendColor, &mCurBlendColor, sizeof(gl::Color)) != 0 ||
298 sampleMask != mCurSampleMask)
299 {
300 ID3D11BlendState *dxBlendState = mStateCache.getBlendState(blendState);
301 if (!dxBlendState)
302 {
303 ERR("NULL blend state returned by RenderStateCache::getBlendState, setting the default "
304 "blend state.");
305 }
306
307 const float blendColors[] = { blendColor.red, blendColor.green, blendColor.blue, blendColor.alpha };
308 mDeviceContext->OMSetBlendState(dxBlendState, blendColors, sampleMask);
309
310 if (dxBlendState)
311 {
312 dxBlendState->Release();
313 }
314 mCurBlendState = blendState;
315 mCurBlendColor = blendColor;
316 mCurSampleMask = sampleMask;
317 }
318
319 mForceSetBlendState = false;
daniel@transgaming.com493d4f82012-11-28 19:35:45 +0000320}
321
daniel@transgaming.com08c331d2012-11-28 19:38:39 +0000322void Renderer11::setDepthStencilState(const gl::DepthStencilState &depthStencilState, int stencilRef,
323 int stencilBackRef, bool frontFaceCCW, unsigned int stencilSize)
daniel@transgaming.com493d4f82012-11-28 19:35:45 +0000324{
daniel@transgaming.com5503fd02012-11-28 19:38:57 +0000325 if (mForceSetDepthStencilState ||
326 memcmp(&depthStencilState, &mCurDepthStencilState, sizeof(gl::DepthStencilState)) != 0 ||
327 stencilRef != mCurStencilRef || stencilBackRef != mCurStencilBackRef)
328 {
329 if (depthStencilState.stencilWritemask != depthStencilState.stencilBackWritemask ||
330 stencilRef != stencilBackRef ||
331 depthStencilState.stencilMask != depthStencilState.stencilBackMask)
332 {
333 ERR("Separate front/back stencil writemasks, reference values, or stencil mask values are "
334 "invalid under WebGL.");
335 return error(GL_INVALID_OPERATION);
336 }
337
338 ID3D11DepthStencilState *dxDepthStencilState = mStateCache.getDepthStencilState(depthStencilState);
339 if (!dxDepthStencilState)
340 {
341 ERR("NULL depth stencil state returned by RenderStateCache::getDepthStencilState, "
342 "setting the default depth stencil state.");
343 }
344
345 mDeviceContext->OMSetDepthStencilState(dxDepthStencilState, static_cast<UINT>(stencilRef));
346
347 if (dxDepthStencilState)
348 {
349 dxDepthStencilState->Release();
350 }
351 mCurDepthStencilState = depthStencilState;
352 mCurStencilRef = stencilRef;
353 mCurStencilBackRef = stencilBackRef;
354 }
355
356 mForceSetDepthStencilState = false;
daniel@transgaming.com493d4f82012-11-28 19:35:45 +0000357}
358
359void Renderer11::setScissorRectangle(const gl::Rectangle& scissor, unsigned int renderTargetWidth,
360 unsigned int renderTargetHeight)
361{
daniel@transgaming.comdcf1e672012-11-28 19:38:19 +0000362 if (mForceSetScissor ||
363 renderTargetWidth != mCurRenderTargetWidth ||
364 renderTargetHeight != mCurRenderTargetHeight ||
365 memcmp(&scissor, &mCurScissor, sizeof(gl::Rectangle)) != 0)
366 {
367 D3D11_RECT rect;
368 rect.left = gl::clamp(scissor.x, 0, static_cast<int>(renderTargetWidth));
daniel@transgaming.com1dd557a2012-11-28 19:44:00 +0000369 rect.top = gl::clamp(scissor.y, 0, static_cast<int>(renderTargetHeight));
daniel@transgaming.comdcf1e672012-11-28 19:38:19 +0000370 rect.right = gl::clamp(scissor.x + scissor.width, 0, static_cast<int>(renderTargetWidth));
daniel@transgaming.com1dd557a2012-11-28 19:44:00 +0000371 rect.bottom = gl::clamp(scissor.y + scissor.height, 0, static_cast<int>(renderTargetHeight));
daniel@transgaming.comdcf1e672012-11-28 19:38:19 +0000372
373 mDeviceContext->RSSetScissorRects(1, &rect);
374
375 mCurScissor = scissor;
376 mCurRenderTargetWidth = renderTargetWidth;
377 mCurRenderTargetHeight = renderTargetHeight;
378 }
379
380 mForceSetScissor = false;
daniel@transgaming.com493d4f82012-11-28 19:35:45 +0000381}
382
daniel@transgaming.com83e80ee2012-11-28 19:40:53 +0000383bool Renderer11::setViewport(const gl::Rectangle& viewport, float zNear, float zFar,
384 unsigned int renderTargetWidth, unsigned int renderTargetHeight,
385 gl::ProgramBinary *currentProgram, bool forceSetUniforms)
386{
daniel@transgaming.com53670042012-11-28 20:55:51 +0000387 bool viewportChanged = mForceSetViewport || memcmp(&viewport, &mCurViewport, sizeof(gl::Rectangle)) != 0 ||
388 zNear != mCurNear || zFar != mCurFar;
389
390 D3D11_VIEWPORT dxViewport;
391 dxViewport.TopLeftX = gl::clamp(viewport.x, 0, static_cast<int>(renderTargetWidth));
392 dxViewport.TopLeftY = gl::clamp(viewport.y, 0, static_cast<int>(renderTargetHeight));
393 dxViewport.Width = gl::clamp(viewport.width, 0, static_cast<int>(renderTargetWidth) - static_cast<int>(dxViewport.TopLeftX));
394 dxViewport.Height = gl::clamp(viewport.height, 0, static_cast<int>(renderTargetHeight) - static_cast<int>(dxViewport.TopLeftY));
395 dxViewport.MinDepth = zNear;
396 dxViewport.MaxDepth = zFar;
397
398 if (dxViewport.Width <= 0 || dxViewport.Height <= 0)
399 {
400 return false; // Nothing to render
401 }
402
403 if (viewportChanged)
404 {
405 mDeviceContext->RSSetViewports(1, &dxViewport);
406
407 mCurViewport = viewport;
408 mCurNear = zNear;
409 mCurFar = zFar;
410 }
411
412 if (currentProgram && (viewportChanged || forceSetUniforms))
413 {
414 GLint halfPixelSize = currentProgram->getDxHalfPixelSizeLocation();
415 GLfloat xy[2] = { 0.0f, 0.0f };
416 currentProgram->setUniform2fv(halfPixelSize, 1, xy);
417
418 // These values are used for computing gl_FragCoord in Program::linkVaryings().
419 GLint coord = currentProgram->getDxCoordLocation();
420 GLfloat whxy[4] = { viewport.width * 0.5f,
421 viewport.height * 0.5f,
422 viewport.x + (viewport.width * 0.5f),
423 viewport.y + (viewport.height * 0.5f) };
424 currentProgram->setUniform4fv(coord, 1, whxy);
425
426 GLint depth = currentProgram->getDxDepthLocation();
427 GLfloat dz[2] = { (zFar - zNear) * 0.5f, (zNear + zFar) * 0.5f };
428 currentProgram->setUniform2fv(depth, 1, dz);
429
430 GLint depthRange = currentProgram->getDxDepthRangeLocation();
431 GLfloat nearFarDiff[3] = { zNear, zFar, zFar - zNear };
432 currentProgram->setUniform3fv(depthRange, 1, nearFarDiff);
433 }
434
435 mForceSetViewport = false;
daniel@transgaming.com83e80ee2012-11-28 19:40:53 +0000436 return true;
437}
438
daniel@transgaming.comae39ee22012-11-28 19:42:02 +0000439bool Renderer11::applyRenderTarget(gl::Framebuffer *frameBuffer)
daniel@transgaming.com493d4f82012-11-28 19:35:45 +0000440{
441 // TODO
442 UNIMPLEMENTED();
daniel@transgaming.comdcf1e672012-11-28 19:38:19 +0000443
444 mForceSetScissor = true;
daniel@transgaming.com53670042012-11-28 20:55:51 +0000445 mForceSetViewport = true;
daniel@transgaming.comae39ee22012-11-28 19:42:02 +0000446
447 return true;
daniel@transgaming.com493d4f82012-11-28 19:35:45 +0000448}
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000449
daniel@transgaming.comdef9f0f2012-11-28 20:53:20 +0000450GLenum Renderer11::applyVertexBuffer(gl::ProgramBinary *programBinary, gl::VertexAttribute vertexAttributes[], GLint first, GLsizei count, GLsizei instances, GLsizei *repeatDraw)
451{
452 // TODO
453 UNIMPLEMENTED();
454
455 return GL_OUT_OF_MEMORY;
456}
457
daniel@transgaming.com5fbf1772012-11-28 20:54:43 +0000458void Renderer11::applyShaders(gl::ProgramBinary *programBinary)
459{
460 // TODO
461 UNIMPLEMENTED();
462}
463
daniel@transgaming.com084a2572012-11-28 20:55:17 +0000464void Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer)
daniel@transgaming.comd084c622012-11-28 19:36:05 +0000465{
466 // TODO
467 UNIMPLEMENTED();
468}
469
daniel@transgaming.comc43a6052012-11-28 19:41:51 +0000470void Renderer11::markAllStateDirty()
471{
472 mForceSetBlendState = true;
473 mForceSetRasterState = true;
474 mForceSetDepthStencilState = true;
475 mForceSetScissor = true;
daniel@transgaming.com53670042012-11-28 20:55:51 +0000476 mForceSetViewport = true;
daniel@transgaming.comc43a6052012-11-28 19:41:51 +0000477}
478
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000479void Renderer11::releaseDeviceResources()
480{
481 // TODO
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000482 // UNIMPLEMENTED();
daniel@transgaming.comf8ba1092012-11-28 19:37:53 +0000483 mStateCache.clear();
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000484}
485
486void Renderer11::markDeviceLost()
487{
488 mDeviceLost = true;
489}
490
491bool Renderer11::isDeviceLost()
492{
493 return mDeviceLost;
494}
495
496// set notify to true to broadcast a message to all contexts of the device loss
497bool Renderer11::testDeviceLost(bool notify)
498{
499 bool isLost = false;
500
501 // TODO
daniel@transgaming.comb9bb2792012-11-28 19:36:49 +0000502 //UNIMPLEMENTED();
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000503
504 if (isLost)
505 {
506 // ensure we note the device loss --
507 // we'll probably get this done again by markDeviceLost
508 // but best to remember it!
509 // Note that we don't want to clear the device loss status here
510 // -- this needs to be done by resetDevice
511 mDeviceLost = true;
512 if (notify)
513 {
514 mDisplay->notifyDeviceLost();
515 }
516 }
517
518 return isLost;
519}
520
521bool Renderer11::testDeviceResettable()
522{
523 HRESULT status = D3D_OK;
524
525 // TODO
526 UNIMPLEMENTED();
527
528 switch (status)
529 {
530 case D3DERR_DEVICENOTRESET:
531 case D3DERR_DEVICEHUNG:
532 return true;
533 default:
534 return false;
535 }
536}
537
538bool Renderer11::resetDevice()
539{
540 releaseDeviceResources();
541
542 // TODO
543 UNIMPLEMENTED();
544
545 // reset device defaults
546 initializeDevice();
547 mDeviceLost = false;
548
549 return true;
550}
551
552DWORD Renderer11::getAdapterVendor() const
553{
554 // TODO
555 UNIMPLEMENTED();
556 return 0;
557}
558
559const char *Renderer11::getAdapterDescription() const
560{
561 // TODO
562 UNIMPLEMENTED();
563 return "UNIMPLEMENTED";
564}
565
566GUID Renderer11::getAdapterIdentifier() const
567{
568 // TODO
569 UNIMPLEMENTED();
570 GUID foo = {};
571 return foo;
572}
573
574bool Renderer11::getDXT1TextureSupport()
575{
576 // TODO
577 UNIMPLEMENTED();
578 return false;
579}
580
581bool Renderer11::getDXT3TextureSupport()
582{
583 // TODO
584 UNIMPLEMENTED();
585 return false;
586}
587
588bool Renderer11::getDXT5TextureSupport()
589{
590 // TODO
591 UNIMPLEMENTED();
592 return false;
593}
594
595bool Renderer11::getDepthTextureSupport() const
596{
597 // TODO
598 UNIMPLEMENTED();
599 return false;
600}
601
602bool Renderer11::getFloat32TextureSupport(bool *filtering, bool *renderable)
603{
604 // TODO
605 UNIMPLEMENTED();
606
607 *filtering = false;
608 *renderable = false;
609 return false;
610}
611
612bool Renderer11::getFloat16TextureSupport(bool *filtering, bool *renderable)
613{
614 // TODO
615 UNIMPLEMENTED();
616
617 *filtering = false;
618 *renderable = false;
619 return false;
620}
621
622bool Renderer11::getLuminanceTextureSupport()
623{
624 // TODO
625 UNIMPLEMENTED();
626 return false;
627}
628
629bool Renderer11::getLuminanceAlphaTextureSupport()
630{
631 // TODO
632 UNIMPLEMENTED();
633 return false;
634}
635
636bool Renderer11::getTextureFilterAnisotropySupport() const
637{
638 // TODO
639 UNIMPLEMENTED();
640 return false;
641}
642
643float Renderer11::getTextureMaxAnisotropy() const
644{
645 // TODO
646 UNIMPLEMENTED();
647 return 1.0f;
648}
649
650bool Renderer11::getEventQuerySupport()
651{
652 // TODO
653 UNIMPLEMENTED();
654 return false;
655}
656
657bool Renderer11::getVertexTextureSupport() const
658{
659 // TODO
660 UNIMPLEMENTED();
661 return false;
662}
663
664bool Renderer11::getNonPower2TextureSupport() const
665{
666 // TODO
667 UNIMPLEMENTED();
668 return false;
669}
670
671bool Renderer11::getOcclusionQuerySupport() const
672{
673 // TODO
674 UNIMPLEMENTED();
675 return false;
676}
677
678bool Renderer11::getInstancingSupport() const
679{
680 // TODO
681 UNIMPLEMENTED();
682 return false;
683}
684
685bool Renderer11::getShareHandleSupport() const
686{
687 // TODO
daniel@transgaming.comb9bb2792012-11-28 19:36:49 +0000688 //UNIMPLEMENTED();
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000689
690 // PIX doesn't seem to support using share handles, so disable them.
691 return false && !gl::perfActive();
692}
693
694bool Renderer11::getShaderModel3Support() const
695{
696 // TODO
697 UNIMPLEMENTED();
698 return true;
699}
700
701float Renderer11::getMaxPointSize() const
702{
703 // TODO
704 UNIMPLEMENTED();
705 return 1.0f;
706}
707
708int Renderer11::getMaxTextureWidth() const
709{
daniel@transgaming.com25072f62012-11-28 19:31:32 +0000710 switch (mFeatureLevel)
711 {
712 case D3D_FEATURE_LEVEL_11_0: return D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION; // 16384
713 case D3D_FEATURE_LEVEL_10_1:
714 case D3D_FEATURE_LEVEL_10_0: return D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION; // 8192
715 default: UNREACHABLE(); return 0;
716 }
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000717}
718
719int Renderer11::getMaxTextureHeight() const
720{
daniel@transgaming.com25072f62012-11-28 19:31:32 +0000721 switch (mFeatureLevel)
722 {
723 case D3D_FEATURE_LEVEL_11_0: return D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION; // 16384
724 case D3D_FEATURE_LEVEL_10_1:
725 case D3D_FEATURE_LEVEL_10_0: return D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION; // 8192
726 default: UNREACHABLE(); return 0;
727 }
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000728}
729
730bool Renderer11::get32BitIndexSupport() const
731{
daniel@transgaming.com25072f62012-11-28 19:31:32 +0000732 switch (mFeatureLevel)
733 {
734 case D3D_FEATURE_LEVEL_11_0:
735 case D3D_FEATURE_LEVEL_10_1:
736 case D3D_FEATURE_LEVEL_10_0: return D3D10_REQ_DRAWINDEXED_INDEX_COUNT_2_TO_EXP >= 32; // true
737 default: UNREACHABLE(); return false;
738 }
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000739}
740
741int Renderer11::getMinSwapInterval() const
742{
daniel@transgaming.com8c7b1a92012-11-28 19:34:06 +0000743 return 0;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000744}
745
746int Renderer11::getMaxSwapInterval() const
747{
daniel@transgaming.com8c7b1a92012-11-28 19:34:06 +0000748 return 4;
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000749}
750
751int Renderer11::getMaxSupportedSamples() const
752{
753 // TODO
754 UNIMPLEMENTED();
755 return 1;
756}
757
daniel@transgaming.com31b13e12012-11-28 19:34:30 +0000758bool Renderer11::copyToRenderTarget(TextureStorage2D *dest, TextureStorage2D *source)
daniel@transgaming.comad6aee72012-11-28 19:33:42 +0000759{
760 // TODO
761 UNIMPLEMENTED();
762 return false;
763}
764
daniel@transgaming.com31b13e12012-11-28 19:34:30 +0000765bool Renderer11::copyToRenderTarget(TextureStorageCubeMap *dest, TextureStorageCubeMap *source)
daniel@transgaming.comad6aee72012-11-28 19:33:42 +0000766{
767 // TODO
768 UNIMPLEMENTED();
769 return false;
770}
771
daniel@transgaming.com38380882012-11-28 19:36:39 +0000772bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat,
773 GLint xoffset, GLint yoffset, TextureStorage2D *storage, GLint level)
774{
775 // TODO
776 UNIMPLEMENTED();
777 return false;
778}
779
780bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat,
781 GLint xoffset, GLint yoffset, TextureStorageCubeMap *storage, GLenum target, GLint level)
782{
783 // TODO
784 UNIMPLEMENTED();
785 return false;
786}
787
daniel@transgaming.comf2423652012-11-28 20:53:50 +0000788RenderTarget *Renderer11::createRenderTarget(SwapChain *swapChain, bool depth)
789{
daniel@transgaming.comb6b27bc2012-11-28 20:54:30 +0000790 SwapChain11 *swapChain11 = SwapChain11::makeSwapChain11(swapChain);
791 RenderTarget11 *renderTarget = NULL;
792 if (depth)
793 {
794 renderTarget = new RenderTarget11(this, swapChain11->getDepthStencil(), swapChain11->getWidth(), swapChain11->getHeight());
795 }
796 else
797 {
798 renderTarget = new RenderTarget11(this, swapChain11->getRenderTarget(), swapChain11->getWidth(), swapChain11->getHeight());
799 }
800 return renderTarget;
daniel@transgaming.comf2423652012-11-28 20:53:50 +0000801}
802
803RenderTarget *Renderer11::createRenderTarget(int width, int height, GLenum format, GLsizei samples, bool depth)
804{
805 // TODO
806 UNIMPLEMENTED();
807 return NULL;
808}
809
daniel@transgaming.com6c872172012-11-28 19:39:33 +0000810bool Renderer11::blitRect(gl::Framebuffer *readTarget, gl::Rectangle *readRect, gl::Framebuffer *drawTarget, gl::Rectangle *drawRect,
811 bool blitRenderTarget, bool blitDepthStencil)
812{
813 // TODO
814 UNIMPLEMENTED();
815 return false;
816}
817
818void Renderer11::readPixels(gl::Framebuffer *framebuffer, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type,
819 GLsizei outputPitch, bool packReverseRowOrder, GLint packAlignment, void* pixels)
820{
821 // TODO
822 UNIMPLEMENTED();
823 return;
824}
825
daniel@transgaming.com1d6aff22012-11-28 19:30:42 +0000826}