GteDX11Engine.cpp
Go to the documentation of this file.
1 // David Eberly, Geometric Tools, Redmond WA 98052
2 // Copyright (c) 1998-2017
3 // Distributed under the Boost Software License, Version 1.0.
4 // http://www.boost.org/LICENSE_1_0.txt
5 // http://www.geometrictools.com/License/Boost/LICENSE_1_0.txt
6 // File Version: 3.0.2 (2016/12/09)
7 
8 #include <GTEnginePCH.h>
35 using namespace gte;
36 
37 //----------------------------------------------------------------------------
38 // Public interface specific to DX11.
39 //----------------------------------------------------------------------------
41 {
42  if (mWaitQuery)
43  {
44  mWaitQuery->Release();
45  }
46 
47  // The render state objects (and fonts) are destroyed first so that the
48  // render state objects are removed from the bridges before they are
49  // cleared later in the destructor.
51 
53  mGOListener = nullptr;
54 
56  mDTListener = nullptr;
57 
58  if (mGOMap.HasElements())
59  {
61  {
62  LogWarning("Bridge map is nonempty on destruction.");
63  }
64 
65  mGOMap.RemoveAll();
66  }
67 
68  if (mDTMap.HasElements())
69  {
71  {
72  LogWarning("Draw target map nonempty on destruction.");
73  }
74 
75  mDTMap.RemoveAll();
76  }
77 
78  if (mILMap->HasElements())
79  {
81  {
82  LogWarning("Input layout map nonempty on destruction.");
83  }
84 
85  mILMap->UnbindAll();
86  }
87  mILMap = nullptr;
88 
91  DestroyDevice();
92 }
93 
94 DX11Engine::DX11Engine(D3D_FEATURE_LEVEL minFeatureLevel)
95 {
96  Initialize(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, minFeatureLevel);
97  CreateDevice();
98 }
99 
100 DX11Engine::DX11Engine(IDXGIAdapter* adapter, D3D_DRIVER_TYPE driverType,
101  HMODULE softwareModule, UINT flags, D3D_FEATURE_LEVEL minFeatureLevel)
102 {
103  Initialize(adapter, driverType, softwareModule, flags, minFeatureLevel);
104  CreateDevice();
105 }
106 
107 DX11Engine::DX11Engine(HWND handle, UINT xSize, UINT ySize, D3D_FEATURE_LEVEL minFeatureLevel)
108 {
109  Initialize(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, minFeatureLevel);
110 
111  if (CreateDevice() && CreateSwapChain(handle, xSize, ySize) && CreateBackBuffer(xSize, ySize))
112  {
114  }
115  else
116  {
120  DestroyDevice();
121  }
122 }
123 
124 DX11Engine::DX11Engine(IDXGIAdapter* adapter, HWND handle, UINT xSize,
125  UINT ySize, D3D_DRIVER_TYPE driverType, HMODULE softwareModule,
126  UINT flags, D3D_FEATURE_LEVEL minFeatureLevel)
127 {
128  Initialize(adapter, driverType, softwareModule, flags, minFeatureLevel);
129 
130  if (CreateDevice() && CreateSwapChain(handle, xSize, ySize) && CreateBackBuffer(xSize, ySize))
131  {
133  }
134  else
135  {
139  DestroyDevice();
140  }
141 }
142 
143 DX11GraphicsObject* DX11Engine::Share(std::shared_ptr<Texture2> const& texture, DX11Engine* engine)
144 {
145  if (!texture || !engine)
146  {
147  LogError("The inputs must be nonnull.");
148  return nullptr;
149  }
150 
151  if (!texture->IsShared())
152  {
153  LogError("The texture must allow sharing.");
154  return nullptr;
155  }
156 
157  DX11GraphicsObject* dxTexture = static_cast<DX11GraphicsObject*>(Get(texture));
158  if (dxTexture)
159  {
160  // The texture is already shared by 'this', so nothing to do.
161  return dxTexture;
162  }
163 
164  dxTexture = static_cast<DX11GraphicsObject*>(engine->Get(texture));
165  if (dxTexture)
166  {
167  std::shared_ptr<DX11GraphicsObject> dxShared;
168  if (texture->GetType() == GT_TEXTURE2)
169  {
170  dxShared = std::make_shared<DX11Texture2>(mDevice, static_cast<DX11Texture2 const*>(dxTexture));
171  }
172  else if (texture->GetType() == GT_TEXTURE_RT)
173  {
174  dxShared = std::make_shared<DX11TextureRT>(mDevice, static_cast<DX11TextureRT const*>(dxTexture));
175  }
176  else // texture->GetType() == GT_TEXTURE_DS
177  {
178  dxShared = std::make_shared<DX11TextureDS>(mDevice, static_cast<DX11TextureDS const*>(dxTexture));
179  }
180  mGOMap.Insert(texture.get(), dxShared);
181  return dxTexture;
182  }
183 
184  // The texture is not bound to 'engine'; create a new binding for 'this'.
185  return static_cast<DX11GraphicsObject*>(Bind(texture));
186 }
187 
188 D3D11_MAPPED_SUBRESOURCE DX11Engine::MapForWrite(std::shared_ptr<Resource> const& resource, unsigned int sri)
189 {
190  if (!resource->GetData())
191  {
192  LogWarning("Resource does not have system memory, creating it.");
193  resource->CreateStorage();
194  }
195 
196  DX11Resource* dxResource = static_cast<DX11Resource*>(Bind(resource));
197  return dxResource->MapForWrite(mImmediate, sri);
198 }
199 
200 void DX11Engine::Unmap(std::shared_ptr<Resource> const& resource, unsigned int sri)
201 {
202  DX11Resource* dxResource = static_cast<DX11Resource*>(Bind(resource));
203  dxResource->Unmap(mImmediate, sri);
204 }
205 
206 bool DX11Engine::IsFullscreen(DXGIOutput const& output) const
207 {
208  if (mSwapChain)
209  {
210  auto desc = output.GetDescription();
211  std::wstring name(desc.DeviceName);
212  auto iter = mFullscreenState.find(name);
213  if (iter != mFullscreenState.end())
214  {
215  return iter->second;
216  }
217 
218  // The 'output' has not yet been passed to SetFullscreen, so it is
219  // safe to assume that window is not fullscreen.
220  return false;
221  }
222 
223  LogError("This function requires a swap chain.");
224  return false;
225 }
226 
227 bool DX11Engine::SetFullscreen(DXGIOutput const& output, bool fullscreen)
228 {
229  if (mSwapChain)
230  {
231  auto desc = output.GetDescription();
232  std::wstring name(desc.DeviceName);
233  auto iter = mFullscreenState.find(name);
234  if (iter == mFullscreenState.end())
235  {
236  // This is the first time 'output' has been seen, so insert it
237  // into the map indicating that the window is not fullscreen.
238  iter = mFullscreenState.insert(std::make_pair(name, false)).first;
239  }
240 
241  if (iter->second != fullscreen)
242  {
243  HRESULT hr;
244  if (fullscreen)
245  {
246  hr = mSwapChain->SetFullscreenState(TRUE, output.GetOutput());
247  if (SUCCEEDED(hr))
248  {
249  iter->second = true;
250  return true;
251  }
252  else
253  {
254  LogError("Failed to go fullscreen.");
255  return false;
256  }
257  }
258  else
259  {
260  hr = mSwapChain->SetFullscreenState(FALSE, nullptr);
261  if (SUCCEEDED(hr))
262  {
263  iter->second = false;
264  return true;
265  }
266  else
267  {
268  LogError("Failed to go windowed.");
269  return false;
270  }
271  }
272  }
273  else
274  {
275  // The requested state is the current state, so there is
276  // nothing to do.
277  return false;
278  }
279  }
280 
281  LogError("This function requires a swap chain.");
282  return false;
283 }
284 
286 {
287  if (mSwapChain)
288  {
289  BOOL isFullscreen;
290  IDXGIOutput* display;
291  if (S_OK == mSwapChain->GetFullscreenState(&isFullscreen, &display))
292  {
293  if (isFullscreen)
294  {
295  mSwapChain->SetFullscreenState(FALSE, nullptr);
296  }
297  }
298  }
299 }
300 
302 {
303  if (counter.mFrequencyQuery)
304  {
305  mImmediate->Begin(counter.mFrequencyQuery);
306 
307  mImmediate->End(counter.mStartTimeQuery);
308  while (S_OK != mImmediate->GetData(counter.mStartTimeQuery,
309  &counter.mStartTime, sizeof(counter.mStartTime), 0))
310  {
311  // Wait for end of query.
312  }
313  }
314 }
315 
317 {
318  if (counter.mFrequencyQuery)
319  {
320  mImmediate->End(counter.mFinalTimeQuery);
321  while (S_OK != mImmediate->GetData(counter.mFinalTimeQuery,
322  &counter.mFinalTime, sizeof(counter.mFinalTime), 0))
323  {
324  // Wait for end of query.
325  }
326 
327  mImmediate->End(counter.mFrequencyQuery);
328  while (S_OK != mImmediate->GetData(counter.mFrequencyQuery,
329  &counter.mTimeStamp, sizeof(counter.mTimeStamp), 0))
330  {
331  // Wait for end of query.
332  }
333  }
334 }
335 
336 //----------------------------------------------------------------------------
337 // Private interface specific to DX11.
338 //----------------------------------------------------------------------------
339 void DX11Engine::Initialize(IDXGIAdapter* adapter, D3D_DRIVER_TYPE driverType,
340  HMODULE softwareModule, UINT flags, D3D_FEATURE_LEVEL minFeatureLevel)
341 {
342  // Initialization of DX11Engine members.
343  mAdapter = adapter;
344  mDriverType = driverType;
345  mSoftwareModule = softwareModule;
346  mFlags = flags;
347  mMinFeatureLevel = minFeatureLevel;
348  mDevice = nullptr;
349  mImmediate = nullptr;
350  mFeatureLevel = D3D_FEATURE_LEVEL_9_1;
351 
352  mSwapChain = nullptr;
353  mColorBuffer = nullptr;
354  mColorView = nullptr;
355  mDepthStencilBuffer = nullptr;
356  mDepthStencilView = nullptr;
357  mViewport.TopLeftX = 0.0f;
358  mViewport.TopLeftY = 0.0f;
359  mViewport.Width = 0.0f;
360  mViewport.Height = 0.0f;
361  mViewport.MinDepth = 0.0f;
362  mViewport.MaxDepth = 0.0f;
363 
364  mNumActiveRTs = 0;
365  mActiveRT.fill(nullptr);
366  mActiveDS = nullptr;
368  mSaveRT.fill(nullptr);
369  mSaveDS = nullptr;
370  mWaitQuery = nullptr;
371 
372  // Initialization of GraphicsEngine members that depend on DX11.
373  mILMap = std::make_unique<DX11InputLayoutManager>();
374 
376  {
377  nullptr, // GT_GRAPHICS_OBJECT (abstract base)
378  nullptr, // GT_RESOURCE (abstract base)
379  nullptr, // GT_BUFFER (abstract base)
385  nullptr, // TODO: Implement TypedBuffer
388  nullptr, // GT_TEXTURE (abstract base)
389  nullptr, // GT_TEXTURE_SINGLE (abstract base)
395  nullptr, // GT_TEXTURE_ARRAY (abstract base)
400  nullptr, // GT_SHADER (abstract base)
405  nullptr, // GT_DRAWING_STATE (abstract base)
410  };
411 
413 }
414 
416 {
417  if (mAdapter)
418  {
419  mDriverType = D3D_DRIVER_TYPE_UNKNOWN;
420  return CreateBestMatchingDevice();
421  }
422 
423  IDXGIFactory1* factory = nullptr;
424  HRESULT hr = CreateDXGIFactory1(IID_PPV_ARGS(&factory));
425  if (FAILED(hr))
426  {
427  factory->Release();
428  return false;
429  }
430 
431  if (mDriverType == D3D_DRIVER_TYPE_HARDWARE)
432  {
433  for (uint32_t i = 0; ; ++i)
434  {
435  IDXGIAdapter1* adapter = nullptr;
436  if (factory->EnumAdapters1(i, &adapter) == DXGI_ERROR_NOT_FOUND)
437  {
438  factory->Release();
439  return false;
440  }
441 
442  DXGI_ADAPTER_DESC1 desc;
443  hr = adapter->GetDesc1(&desc);
444  if (FAILED(hr))
445  {
446  factory->Release();
447  adapter->Release();
448  return false;
449  }
450 
451  if (desc.Flags != DXGI_ADAPTER_FLAG_SOFTWARE)
452  {
454  {
455  mAdapter = adapter;
456  factory->Release();
457  adapter->Release();
458  return true;
459  }
460  }
461  else
462  {
463  mDriverType = D3D_DRIVER_TYPE_WARP;
465  {
466  mAdapter = adapter;
467  factory->Release();
468  adapter->Release();
469  return true;
470  }
471  else
472  {
473  return false;
474  }
475  }
476  }
477  }
478 
479  factory->Release();
480  return false;
481 }
482 
484 {
485  // Determine the subarray for creating the device.
486  UINT const maxFeatureLevels = 7;
487  D3D_FEATURE_LEVEL const featureLevels[maxFeatureLevels] =
488  {
489  D3D_FEATURE_LEVEL_11_1,
490  D3D_FEATURE_LEVEL_11_0,
491  D3D_FEATURE_LEVEL_10_1,
492  D3D_FEATURE_LEVEL_10_0,
493  D3D_FEATURE_LEVEL_9_3,
494  D3D_FEATURE_LEVEL_9_2,
495  D3D_FEATURE_LEVEL_9_1
496  };
497 
498  UINT numFeatureLevels = 0;
499  for (UINT i = 0; i < maxFeatureLevels; ++i)
500  {
501  if (mMinFeatureLevel == featureLevels[i])
502  {
503  numFeatureLevels = i + 1;
504  break;
505  }
506  }
507  if (numFeatureLevels == 0)
508  {
509  LogError("Unsupported minimum feature level.");
510  return false;
511  }
512 
513  for (UINT i = 0; i < numFeatureLevels; ++i)
514  {
515  HRESULT hr = D3D11CreateDevice(mAdapter, mDriverType, mSoftwareModule,
516  mFlags, &featureLevels[i], 1, D3D11_SDK_VERSION,
518  if (SUCCEEDED(hr))
519  {
521  if (i == 0 || i == 1)
522  {
524  }
525  else if (i == 2 || i == 3)
526  {
528  }
529  else if (i == 4)
530  {
531  HLSLProgramFactory::defaultVersion = "4_0_level_9_3";
532  }
533  else
534  {
535  HLSLProgramFactory::defaultVersion = "4_0_level_9_1";
536  }
537  return true;
538  }
539  }
540 
541  LogError("Failed to create device");
542  return false;
543 }
544 
545 bool DX11Engine::CreateSwapChain(HWND handle, UINT xSize, UINT ySize)
546 {
547  mXSize = xSize;
548  mYSize = ySize;
549 
550  struct DXGIInterfaces
551  {
552  DXGIInterfaces()
553  :
554  device(nullptr),
555  adapter(nullptr),
556  factory(nullptr)
557  {
558  }
559 
560  ~DXGIInterfaces()
561  {
562  SafeRelease(factory);
563  SafeRelease(adapter);
564  SafeRelease(device);
565  }
566 
567  IDXGIDevice* device;
568  IDXGIAdapter* adapter;
569  IDXGIFactory1* factory;
570  };
571 
572  DXGIInterfaces dxgi;
573  HRESULT hr = mDevice->QueryInterface(__uuidof(IDXGIDevice), reinterpret_cast<void**>(&dxgi.device));
574  CHECK_HR_RETURN("Failed to get DXGI device interface", false);
575 
576  hr = dxgi.device->GetAdapter(&dxgi.adapter);
577  CHECK_HR_RETURN("Failed to get DXGI adapter", false);
578 
579  hr = dxgi.adapter->GetParent(__uuidof(IDXGIFactory1), reinterpret_cast<void**>(&dxgi.factory));
580  CHECK_HR_RETURN("Failed to get DXGI factory", false);
581 
582  DXGI_SWAP_CHAIN_DESC desc;
583  desc.BufferDesc.Width = xSize;
584  desc.BufferDesc.Height = ySize;
585  desc.BufferDesc.RefreshRate.Numerator = 0;
586  desc.BufferDesc.RefreshRate.Denominator = 1;
587  desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
588  desc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
589  desc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
590  desc.SampleDesc.Count = 1;
591  desc.SampleDesc.Quality = 0;
592  desc.BufferUsage = DXGI_USAGE_BACK_BUFFER | DXGI_USAGE_RENDER_TARGET_OUTPUT;
593  desc.BufferCount = 2;
594  desc.OutputWindow = handle;
595  desc.Windowed = TRUE;
596  desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
597  desc.Flags = 0;
598 
599  hr = dxgi.factory->CreateSwapChain(dxgi.device, &desc, &mSwapChain);
600  CHECK_HR_RETURN("Failed to create swap chain", false);
601 
602 #if defined(GTE_GRAPHICS_USE_NAMED_OBJECTS)
603  hr = SetPrivateName(mSwapChain, "DX11Engine::mSwapChain");
604  LogAssert(SUCCEEDED(hr), "Failed to set private name, hr = " + std::to_string(hr));
605 #endif
606 
607  return true;
608 }
609 
611 {
612  struct BackBuffer
613  {
614  BackBuffer()
615  {
616  SetToNull();
617  }
618 
619  ~BackBuffer()
620  {
621  SafeRelease(depthStencilView);
622  SafeRelease(depthStencilBuffer);
623  SafeRelease(colorView);
624  SafeRelease(colorBuffer);
625  }
626 
627  void SetToNull()
628  {
629  colorBuffer = nullptr;
630  colorView = nullptr;
631  depthStencilBuffer = nullptr;
632  depthStencilView = nullptr;
633  }
634 
635  ID3D11Texture2D* colorBuffer;
636  ID3D11RenderTargetView* colorView;
637  ID3D11Texture2D* depthStencilBuffer;
638  ID3D11DepthStencilView* depthStencilView;
639  };
640 
641  BackBuffer bb;
642 
643  // Create the color buffer and its view.
644  HRESULT hr = mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&bb.colorBuffer));
645  CHECK_HR_RETURN("Failed to get color buffer", false);
646 
647 #if defined(GTE_GRAPHICS_USE_NAMED_OBJECTS)
648  hr = SetPrivateName(bb.colorBuffer, "DX11Engine::mColorBuffer");
649  LogAssert(SUCCEEDED(hr), "Failed to set private name, hr = " + std::to_string(hr));
650 #endif
651 
652  hr = mDevice->CreateRenderTargetView(bb.colorBuffer, nullptr, &bb.colorView);
653  CHECK_HR_RETURN("Failed to create color view", false);
654 
655 #if defined(GTE_GRAPHICS_USE_NAMED_OBJECTS)
656  hr = SetPrivateName(bb.colorView, "DX11Engine::mColorView");
657  LogAssert(SUCCEEDED(hr), "Failed to set private name, hr = " + std::to_string(hr));
658 #endif
659 
660  // Create the depth-stencil buffer and its view.
661  D3D11_TEXTURE2D_DESC desc;
662  desc.Width = xSize;
663  desc.Height = ySize;
664  desc.MipLevels = 1;
665  desc.ArraySize = 1;
666  desc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
667  desc.SampleDesc.Count = 1;
668  desc.SampleDesc.Quality = 0;
669  desc.Usage = D3D11_USAGE_DEFAULT;
670  desc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
671  desc.CPUAccessFlags = D3D11_CPU_ACCESS_NONE;
672  desc.MiscFlags = D3D11_RESOURCE_MISC_NONE;
673 
674  hr = mDevice->CreateTexture2D(&desc, nullptr, &bb.depthStencilBuffer);
675  CHECK_HR_RETURN("Failed to create depth-stencil buffer", false);
676 
677 #if defined(GTE_GRAPHICS_USE_NAMED_OBJECTS)
678  hr = SetPrivateName(bb.depthStencilBuffer, "DX11Engine::mDepthStencilBuffer");
679  LogAssert(SUCCEEDED(hr), "Failed to set private name, hr = " + std::to_string(hr));
680 #endif
681 
682  hr = mDevice->CreateDepthStencilView(bb.depthStencilBuffer, nullptr,
683  &bb.depthStencilView);
684  CHECK_HR_RETURN("Failed to create depth-stencil view", false);
685 
686 #if defined(GTE_GRAPHICS_USE_NAMED_OBJECTS)
687  hr = SetPrivateName(bb.depthStencilView, "DX11Engine::mDepthStencilView");
688  LogAssert(SUCCEEDED(hr), "Failed to set private name, hr = " + std::to_string(hr));
689 #endif
690 
691  // The back buffer has been created successfully. Transfer the
692  // resources to 'this' members.
693  mColorBuffer = bb.colorBuffer;
694  mColorView = bb.colorView;
695  mDepthStencilBuffer = bb.depthStencilBuffer;
696  mDepthStencilView = bb.depthStencilView;
697  bb.SetToNull();
698 
699  mViewport.Width = static_cast<float>(xSize);
700  mViewport.Height = static_cast<float>(ySize);
701  mViewport.TopLeftX = 0.0f;
702  mViewport.TopLeftY = 0.0f;
703  mViewport.MinDepth = 0.0f;
704  mViewport.MaxDepth = 1.0f;
705  mImmediate->RSSetViewports(1, &mViewport);
706 
707  mNumActiveRTs = 1;
708  mActiveRT[0] = mColorView;
710  mImmediate->OMSetRenderTargets(1, mActiveRT.data(), mActiveDS);
711  return true;
712 }
713 
715 {
716  std::shared_ptr<HLSLProgramFactory> factory = std::make_shared<HLSLProgramFactory>();
717  mDefaultFont = std::make_shared<FontArialW400H18>(factory, 256);
718  SetDefaultFont();
719 
721 }
722 
724 {
725  if (mDefaultFont)
726  {
727  mDefaultFont = nullptr;
728  mActiveFont = nullptr;
729  }
730 
732 }
733 
735 {
736  return FinalRelease(mImmediate) == 0 && FinalRelease(mDevice) == 0;
737 }
738 
740 {
741  bool successful = true;
742  ULONG refs;
743 
744  if (mSwapChain)
745  {
746  refs = mSwapChain->Release();
747  if (refs > 0)
748  {
749  LogError("Swap chain not released.");
750  successful = false;
751  }
752  mSwapChain = nullptr;
753  }
754 
755  return successful;
756 }
757 
759 {
760  if (mImmediate)
761  {
762  ID3D11RenderTargetView* rtView = nullptr;
763  ID3D11DepthStencilView* dsView = nullptr;
764  mImmediate->OMSetRenderTargets(1, &rtView, dsView);
765  }
766 
767  mActiveRT[0] = nullptr;
768  mActiveDS = nullptr;
769 
770  return FinalRelease(mColorView) == 0
771  && FinalRelease(mColorBuffer) == 0
774 }
775 
776 uint64_t DX11Engine::DrawPrimitive(VertexBuffer const* vbuffer, IndexBuffer const* ibuffer)
777 {
778  UINT numActiveVertices = vbuffer->GetNumActiveElements();
779  UINT vertexOffset = vbuffer->GetOffset();
780 
781  UINT numActiveIndices = ibuffer->GetNumActiveIndices();
782  UINT firstIndex = ibuffer->GetFirstIndex();
783  IPType type = ibuffer->GetPrimitiveType();
784 
785  switch (type)
786  {
788  mImmediate->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST);
789  break;
791  mImmediate->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST);
792  break;
794  mImmediate->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP);
795  break;
796  case IPType::IP_TRIMESH:
797  mImmediate->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
798  break;
799  case IPType::IP_TRISTRIP:
800  mImmediate->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
801  break;
803  mImmediate->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST_ADJ);
804  break;
806  mImmediate->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ);
807  break;
809  mImmediate->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ);
810  break;
812  mImmediate->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ);
813  break;
814  default:
815  LogError("Unknown primitive topology = " + std::to_string(type));
816  return 0;
817  }
818 
819  ID3D11Query* occlusionQuery = nullptr;
820  uint64_t numPixelsDrawn = 0;
822  {
823  occlusionQuery = BeginOcclusionQuery();
824  }
825 
826  if (ibuffer->IsIndexed())
827  {
828  if (numActiveIndices > 0)
829  {
830  mImmediate->DrawIndexed(numActiveIndices, firstIndex, vertexOffset);
831  }
832  }
833  else
834  {
835  if (numActiveVertices > 0)
836  {
837  mImmediate->Draw(numActiveVertices, vertexOffset);
838  }
839  }
840 
842  {
843  numPixelsDrawn = EndOcclusionQuery(occlusionQuery);
844  }
845 
846  return numPixelsDrawn;
847 }
848 
850 {
851  D3D11_QUERY_DESC desc;
852  desc.Query = D3D11_QUERY_OCCLUSION;
853  desc.MiscFlags = D3D11_QUERY_MISC_NONE;
854  ID3D11Query* occlusionQuery = nullptr;
855  HRESULT hr = mDevice->CreateQuery(&desc, &occlusionQuery);
856  if (SUCCEEDED(hr))
857  {
858  mImmediate->Begin(occlusionQuery);
859  return occlusionQuery;
860  }
861 
862  LogError("CreateQuery failed.");
863  return nullptr;
864 }
865 
866 uint64_t DX11Engine::EndOcclusionQuery(ID3D11Query* occlusionQuery)
867 {
868  if (occlusionQuery)
869  {
870  mImmediate->End(occlusionQuery);
871  UINT64 data = 0;
872  UINT size = sizeof(UINT64);
873  while (S_OK != mImmediate->GetData(occlusionQuery, &data, size, 0))
874  {
875  // Wait for end of query.
876  }
877  occlusionQuery->Release();
878  return data;
879  }
880 
881  LogError("No query provided.");
882  return 0;
883 }
884 
885 bool DX11Engine::EnableShaders(std::shared_ptr<VisualEffect> const& effect,
886  DX11VertexShader*& dxVShader, DX11GeometryShader*& dxGShader, DX11PixelShader*& dxPShader)
887 {
888  dxVShader = nullptr;
889  dxGShader = nullptr;
890  dxPShader = nullptr;
891 
892  // Get the active vertex shader.
893  if (!effect->GetVertexShader())
894  {
895  LogError("Effect does not have a vertex shader.");
896  return false;
897  }
898  dxVShader = static_cast<DX11VertexShader*>(Bind(effect->GetVertexShader()));
899 
900  // Get the active geometry shader (if any).
901  if (effect->GetGeometryShader())
902  {
903  dxGShader = static_cast<DX11GeometryShader*>(Bind(effect->GetGeometryShader()));
904  }
905 
906  // Get the active pixel shader.
907  if (!effect->GetPixelShader())
908  {
909  LogError("Effect does not have a pixel shader.");
910  return false;
911  }
912  dxPShader = static_cast<DX11PixelShader*>(Bind(effect->GetPixelShader()));
913 
914  // Enable the shaders and resources.
915  Enable(effect->GetVertexShader().get(), dxVShader);
916  Enable(effect->GetPixelShader().get(), dxPShader);
917  if (dxGShader)
918  {
919  Enable(effect->GetGeometryShader().get(), dxGShader);
920  }
921 
922  return true;
923 }
924 
925 void DX11Engine::DisableShaders(std::shared_ptr<VisualEffect> const& effect,
926  DX11VertexShader* dxVShader, DX11GeometryShader* dxGShader, DX11PixelShader* dxPShader)
927 {
928  if (dxGShader)
929  {
930  Disable(effect->GetGeometryShader().get(), dxGShader);
931  }
932  Disable(effect->GetPixelShader().get(), dxPShader);
933  Disable(effect->GetVertexShader().get(), dxVShader);
934 }
935 
937 {
938  dxShader->Enable(mImmediate);
939  EnableCBuffers(shader, dxShader);
940  EnableTBuffers(shader, dxShader);
941  EnableSBuffers(shader, dxShader);
942  EnableRBuffers(shader, dxShader);
943  EnableTextures(shader, dxShader);
944  EnableTextureArrays(shader, dxShader);
945  EnableSamplers(shader, dxShader);
946 }
947 
949 {
950  DisableSamplers(shader, dxShader);
951  DisableTextureArrays(shader, dxShader);
952  DisableTextures(shader, dxShader);
953  DisableRBuffers(shader, dxShader);
954  DisableSBuffers(shader, dxShader);
955  DisableTBuffers(shader, dxShader);
956  DisableCBuffers(shader, dxShader);
957  dxShader->Disable(mImmediate);
958 }
959 
961 {
963  for (auto const& cb : shader->GetData(index))
964  {
965  if (cb.object)
966  {
967  DX11ConstantBuffer* dxCB = static_cast<DX11ConstantBuffer*>(Bind(cb.object));
968  if (dxCB)
969  {
970  dxShader->EnableCBuffer(mImmediate, cb.bindPoint, dxCB->GetDXBuffer());
971  }
972  else
973  {
974  LogError("Failed to bind constant buffer.");
975  }
976  }
977  else
978  {
979  LogError(cb.name + " is null constant buffer.");
980  }
981  }
982 }
983 
985 {
987  for (auto const& cb : shader->GetData(index))
988  {
989  dxShader->DisableCBuffer(mImmediate, cb.bindPoint);
990  }
991 }
992 
994 {
996  for (auto const& tb : shader->GetData(index))
997  {
998  if (tb.object)
999  {
1000  DX11TextureBuffer* dxTB = static_cast<DX11TextureBuffer*>(Bind(tb.object));
1001  if (dxTB)
1002  {
1003  dxShader->EnableSRView(mImmediate, tb.bindPoint, dxTB->GetSRView());
1004  }
1005  else
1006  {
1007  LogError("Failed to bind texture buffer.");
1008  }
1009  }
1010  else
1011  {
1012  LogError(tb.name + " is null texture buffer.");
1013  }
1014  }
1015 }
1016 
1018 {
1020  for (auto const& tb : shader->GetData(index))
1021  {
1022  dxShader->DisableSRView(mImmediate, tb.bindPoint);
1023  }
1024 }
1025 
1027 {
1029  for (auto const& sb : shader->GetData(index))
1030  {
1031  if (sb.object)
1032  {
1033  DX11StructuredBuffer* dxSB = static_cast<DX11StructuredBuffer*>(Bind(sb.object));
1034  if (dxSB)
1035  {
1036  if (sb.isGpuWritable)
1037  {
1038  StructuredBuffer* gtSB = static_cast<StructuredBuffer*>(sb.object.get());
1039 
1040  unsigned int numActive = (gtSB->GetKeepInternalCount() ?
1041  0xFFFFFFFFu : gtSB->GetNumActiveElements());
1042  dxShader->EnableUAView(mImmediate, sb.bindPoint, dxSB->GetUAView(), numActive);
1043  }
1044  else
1045  {
1046  dxShader->EnableSRView(mImmediate, sb.bindPoint, dxSB->GetSRView());
1047  }
1048  }
1049  else
1050  {
1051  LogError("Failed to bind structured buffer.");
1052  }
1053  }
1054  else
1055  {
1056  LogError(sb.name + " is null structured buffer.");
1057  }
1058  }
1059 }
1060 
1062 {
1064  for (auto const& sb : shader->GetData(index))
1065  {
1066  if (sb.isGpuWritable)
1067  {
1068  dxShader->DisableUAView(mImmediate, sb.bindPoint);
1069  }
1070  else
1071  {
1072  dxShader->DisableSRView(mImmediate, sb.bindPoint);
1073  }
1074  }
1075 }
1076 
1078 {
1079  int const index = RawBuffer::shaderDataLookup;
1080  for (auto const& rb : shader->GetData(index))
1081  {
1082  if (rb.object)
1083  {
1084  DX11RawBuffer* dxRB = static_cast<DX11RawBuffer*>(Bind(rb.object));
1085  if (dxRB)
1086  {
1087  if (rb.isGpuWritable)
1088  {
1089  dxShader->EnableUAView(mImmediate, rb.bindPoint, dxRB->GetUAView(), 0xFFFFFFFFu);
1090  }
1091  else
1092  {
1093  dxShader->EnableSRView(mImmediate, rb.bindPoint, dxRB->GetSRView());
1094  }
1095  }
1096  else
1097  {
1098  LogError("Failed to bind byte-address buffer.");
1099  }
1100  }
1101  else
1102  {
1103  LogError(rb.name + " is null byte-address buffer.");
1104  }
1105  }
1106 }
1107 
1109 {
1110  int const index = RawBuffer::shaderDataLookup;
1111  for (auto const& rb : shader->GetData(index))
1112  {
1113  if (rb.isGpuWritable)
1114  {
1115  dxShader->DisableUAView(mImmediate, rb.bindPoint);
1116  }
1117  else
1118  {
1119  dxShader->DisableSRView(mImmediate, rb.bindPoint);
1120  }
1121  }
1122 }
1123 
1125 {
1127  for (auto const& tx : shader->GetData(index))
1128  {
1129  if (tx.object)
1130  {
1131  DX11TextureSingle* dxTX = static_cast<DX11TextureSingle*>(Bind(tx.object));
1132  if (dxTX)
1133  {
1134  if (tx.isGpuWritable)
1135  {
1136  dxShader->EnableUAView(mImmediate, tx.bindPoint, dxTX->GetUAView(), 0xFFFFFFFFu);
1137  }
1138  else
1139  {
1140  dxShader->EnableSRView(mImmediate, tx.bindPoint, dxTX->GetSRView());
1141  }
1142  }
1143  else
1144  {
1145  LogError("Failed to bind texture.");
1146  }
1147  }
1148  else
1149  {
1150  LogError(tx.name + " is null texture.");
1151  }
1152  }
1153 }
1154 
1156 {
1158  for (auto const& tx : shader->GetData(index))
1159  {
1160  if (tx.isGpuWritable)
1161  {
1162  dxShader->DisableUAView(mImmediate, tx.bindPoint);
1163  }
1164  else
1165  {
1166  dxShader->DisableSRView(mImmediate, tx.bindPoint);
1167  }
1168  }
1169 }
1170 
1172 {
1174  for (auto const& ta : shader->GetData(index))
1175  {
1176  if (ta.object)
1177  {
1178  DX11TextureArray* dxTA = static_cast<DX11TextureArray*>(Bind(ta.object));
1179  if (dxTA)
1180  {
1181  if (ta.isGpuWritable)
1182  {
1183  dxShader->EnableUAView(mImmediate, ta.bindPoint, dxTA->GetUAView(), 0xFFFFFFFFu);
1184  }
1185  else
1186  {
1187  dxShader->EnableSRView(mImmediate, ta.bindPoint, dxTA->GetSRView());
1188  }
1189  }
1190  else
1191  {
1192  LogError("Failed to bind texture array.");
1193  }
1194  }
1195  else
1196  {
1197  LogError(ta.name + " is null texture array.");
1198  }
1199  }
1200 }
1201 
1203  DX11Shader* dxShader)
1204 {
1206  for (auto const& ta : shader->GetData(index))
1207  {
1208  if (ta.isGpuWritable)
1209  {
1210  dxShader->DisableUAView(mImmediate, ta.bindPoint);
1211  }
1212  else
1213  {
1214  dxShader->DisableSRView(mImmediate, ta.bindPoint);
1215  }
1216  }
1217 }
1218 
1220 {
1222  for (auto const& ss : shader->GetData(index))
1223  {
1224  if (ss.object)
1225  {
1226  DX11SamplerState* dxSS = static_cast<DX11SamplerState*>(Bind(ss.object));
1227  if (dxSS)
1228  {
1229  dxShader->EnableSampler(mImmediate, ss.bindPoint, dxSS->GetDXSamplerState());
1230  }
1231  else
1232  {
1233  LogError("Failed to bind sampler state.");
1234  }
1235  }
1236  else
1237  {
1238  LogError(ss.name + " is null sampler state.");
1239  }
1240  }
1241 }
1242 
1244 {
1246  for (auto const& ss : shader->GetData(index))
1247  {
1248  dxShader->DisableSampler(mImmediate, ss.bindPoint);
1249  }
1250 }
1251 
1252 //----------------------------------------------------------------------------
1253 // Public overrides from GraphicsEngine
1254 //----------------------------------------------------------------------------
1255 void DX11Engine::SetViewport(int x, int y, int w, int h)
1256 {
1257  UINT numViewports = 1;
1258  mImmediate->RSGetViewports(&numViewports, &mViewport);
1259  LogAssert(1 == numViewports, "Failed to get viewport.");
1260 
1261  mViewport.TopLeftX = static_cast<float>(x);
1262  mViewport.TopLeftY = static_cast<float>(y);
1263  mViewport.Width = static_cast<float>(w);
1264  mViewport.Height = static_cast<float>(h);
1265  mImmediate->RSSetViewports(1, &mViewport);
1266 }
1267 
1268 void DX11Engine::GetViewport(int& x, int& y, int& w, int& h) const
1269 {
1270  UINT numViewports = 1;
1271  D3D11_VIEWPORT viewport;
1272  mImmediate->RSGetViewports(&numViewports, &viewport);
1273  LogAssert(1 == numViewports, "Failed to get viewport.");
1274 
1275  x = static_cast<unsigned int>(viewport.TopLeftX);
1276  y = static_cast<unsigned int>(viewport.TopLeftY);
1277  w = static_cast<unsigned int>(viewport.Width);
1278  h = static_cast<unsigned int>(viewport.Height);
1279 }
1280 
1281 void DX11Engine::SetDepthRange(float zmin, float zmax)
1282 {
1283  UINT numViewports = 1;
1284  mImmediate->RSGetViewports(&numViewports, &mViewport);
1285  LogAssert(1 == numViewports, "Failed to get viewport.");
1286 
1287  mViewport.MinDepth = zmin;
1288  mViewport.MaxDepth = zmax;
1289  mImmediate->RSSetViewports(1, &mViewport);
1290 }
1291 
1292 void DX11Engine::GetDepthRange(float& zmin, float& zmax) const
1293 {
1294  UINT numViewports = 1;
1295  D3D11_VIEWPORT viewport;
1296  mImmediate->RSGetViewports(&numViewports, &viewport);
1297  LogAssert(1 == numViewports, "Failed to get viewport.");
1298 
1299  zmin = viewport.MinDepth;
1300  zmax = viewport.MaxDepth;
1301 }
1302 
1303 bool DX11Engine::Resize(unsigned int w, unsigned int h)
1304 {
1305  // Release the previous back buffer before resizing.
1306  if (DestroyBackBuffer())
1307  {
1308  // Attempt to resize the back buffer to the incoming width and height.
1309  DXGI_SWAP_CHAIN_DESC desc;
1310  mSwapChain->GetDesc(&desc);
1311  HRESULT hr = mSwapChain->ResizeBuffers(desc.BufferCount, w, h,
1312  DXGI_FORMAT_R8G8B8A8_UNORM, 0);
1313  if (SUCCEEDED(hr))
1314  {
1315  // The attempt succeeded, so create new color and depth-stencil
1316  // objects.
1317  return CreateBackBuffer(w, h);
1318  }
1319 
1320  // The attempt to resize failed, so restore the back buffer to its
1321  // previous width and height.
1322  w = desc.BufferDesc.Width;
1323  h = desc.BufferDesc.Height;
1324  hr = mSwapChain->ResizeBuffers(desc.BufferCount, w, h,
1325  DXGI_FORMAT_R8G8B8A8_UNORM, 0);
1326  if (SUCCEEDED(hr))
1327  {
1328  return CreateBackBuffer(w, h);
1329  }
1330  }
1331  return false;
1332 }
1333 
1335 {
1336  ID3D11RenderTargetView* rtViews[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT] = { nullptr };
1337  ID3D11DepthStencilView* dsView = nullptr;
1338 
1339  mImmediate->OMGetRenderTargets(mNumActiveRTs, rtViews, &dsView);
1340  SafeRelease(dsView);
1341  for (unsigned int i = 0; i < mNumActiveRTs; ++i)
1342  {
1343  if (rtViews[i])
1344  {
1345  mImmediate->ClearRenderTargetView(rtViews[i], mClearColor.data());
1346  rtViews[i]->Release();
1347  }
1348  }
1349 }
1350 
1352 {
1353  ID3D11DepthStencilView* dsView = nullptr;
1354  ID3D11RenderTargetView* rtView = nullptr;
1355  mImmediate->OMGetRenderTargets(1, &rtView, &dsView);
1356  SafeRelease(rtView);
1357  if (dsView)
1358  {
1359  mImmediate->ClearDepthStencilView(dsView, D3D11_CLEAR_DEPTH, mClearDepth, 0);
1360  dsView->Release();
1361  }
1362 }
1363 
1365 {
1366  ID3D11DepthStencilView* dsView = nullptr;
1367  ID3D11RenderTargetView* rtView = nullptr;
1368  mImmediate->OMGetRenderTargets(1, &rtView, &dsView);
1369  SafeRelease(rtView);
1370  if (dsView)
1371  {
1372  mImmediate->ClearDepthStencilView(dsView, D3D11_CLEAR_STENCIL, 0.0f,
1373  static_cast<UINT8>(mClearStencil));
1374  dsView->Release();
1375  }
1376 }
1377 
1379 {
1380  ID3D11RenderTargetView* rtViews[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT] = { nullptr };
1381  ID3D11DepthStencilView* dsView = nullptr;
1382 
1383  mImmediate->OMGetRenderTargets(mNumActiveRTs, rtViews, &dsView);
1384  for (unsigned int i = 0; i < mNumActiveRTs; ++i)
1385  {
1386  if (rtViews[i])
1387  {
1388  mImmediate->ClearRenderTargetView(rtViews[i], mClearColor.data());
1389  rtViews[i]->Release();
1390  }
1391  }
1392  if (dsView)
1393  {
1394  mImmediate->ClearDepthStencilView(dsView,
1395  D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, mClearDepth,
1396  static_cast<UINT8>(mClearStencil));
1397  dsView->Release();
1398  }
1399 }
1400 
1401 void DX11Engine::DisplayColorBuffer(unsigned int syncInterval)
1402 {
1403  // The swap must occur on the thread in which the device was created.
1404  mSwapChain->Present(syncInterval, 0);
1405 }
1406 
1407 void DX11Engine::SetBlendState(std::shared_ptr<BlendState> const& state)
1408 {
1409  if (state)
1410  {
1411  if (state != mActiveBlendState)
1412  {
1413  DX11BlendState* dxState = static_cast<DX11BlendState*>(Bind(state));
1414  if (dxState)
1415  {
1416  dxState->Enable(mImmediate);
1417  mActiveBlendState = state;
1418  }
1419  else
1420  {
1421  LogError("Failed to bind blend state.");
1422  }
1423  }
1424  }
1425  else
1426  {
1427  LogError("Input state is null.");
1428  }
1429 }
1430 
1431 void DX11Engine::SetDepthStencilState(std::shared_ptr<DepthStencilState> const& state)
1432 {
1433  if (state)
1434  {
1435  if (state != mActiveDepthStencilState)
1436  {
1437  DX11DepthStencilState* dxState = static_cast<DX11DepthStencilState*>(Bind(state));
1438  if (dxState)
1439  {
1440  dxState->Enable(mImmediate);
1441  mActiveDepthStencilState = state;
1442  }
1443  else
1444  {
1445  LogError("Failed to bind depth-stencil state.");
1446  }
1447  }
1448  }
1449  else
1450  {
1451  LogError("Input state is null.");
1452  }
1453 }
1454 
1455 void DX11Engine::SetRasterizerState(std::shared_ptr<RasterizerState> const& state)
1456 {
1457  if (state)
1458  {
1459  if (state != mActiveRasterizerState)
1460  {
1461  DX11RasterizerState* dxState = static_cast<DX11RasterizerState*>(Bind(state));
1462  if (dxState)
1463  {
1464  dxState->Enable(mImmediate);
1465  mActiveRasterizerState = state;
1466  }
1467  else
1468  {
1469  LogError("Failed to bind rasterizer state.");
1470  }
1471  }
1472  }
1473  else
1474  {
1475  LogError("Input state is null.");
1476  }
1477 }
1478 
1479 void DX11Engine::Enable(std::shared_ptr<DrawTarget> const& target)
1480 {
1481  DX11DrawTarget* dxTarget = static_cast<DX11DrawTarget*>(Bind(target));
1482  dxTarget->Enable(mImmediate);
1483  mNumActiveRTs = target->GetNumTargets();
1484 }
1485 
1486 void DX11Engine::Disable(std::shared_ptr<DrawTarget> const& target)
1487 {
1488  DX11DrawTarget* dxTarget = static_cast<DX11DrawTarget*>(Bind(target));
1489  if (dxTarget)
1490  {
1491  dxTarget->Disable(mImmediate);
1492  mNumActiveRTs = 1;
1493 
1494  // The assumption is that Disable is called after you have written
1495  // the draw target outputs. If the render targets want automatic
1496  // mipmap generation, we do so here.
1497  if (target->WantAutogenerateRTMipmaps())
1498  {
1499  unsigned int const numTargets = target->GetNumTargets();
1500  for (unsigned int i = 0; i < numTargets; ++i)
1501  {
1502  DX11Texture* dxTexture = static_cast<DX11Texture*>(Get(target->GetRTTexture(i)));
1503  ID3D11ShaderResourceView* srView = dxTexture->GetSRView();
1504  if (srView)
1505  {
1506  mImmediate->GenerateMips(dxTexture->GetSRView());
1507  }
1508  }
1509  }
1510  }
1511 }
1512 
1513 DX11Texture2* DX11Engine::BindTexture(std::shared_ptr<Texture2> const& texture,
1514  ID3D11Texture2D* dxTexture, ID3D11ShaderResourceView* dxSRView)
1515 {
1516  if (!texture || !dxTexture || !dxSRView)
1517  {
1518  LogError("Attempt to bind a null object.");
1519  return nullptr;
1520  }
1521 
1522  GraphicsObject const* gtObject = texture.get();
1523  std::shared_ptr<GEObject> geObject;
1524  if (!mGOMap.Get(gtObject, geObject))
1525  {
1526  geObject = std::make_shared<DX11Texture2>(texture.get(), dxTexture, dxSRView);
1527  LogAssert(geObject, "Null object. Out of memory?");
1528  mGOMap.Insert(gtObject, geObject);
1529 #if defined(GTE_GRAPHICS_USE_NAMED_OBJECTS)
1530  geObject->SetName(texture->GetName());
1531 #endif
1532  }
1533  return static_cast<DX11Texture2*>(geObject.get());
1534 }
1535 
1536 bool DX11Engine::Update(std::shared_ptr<Buffer> const& buffer)
1537 {
1538  if (!buffer->GetData())
1539  {
1540  LogWarning("Buffer does not have system memory, creating it.");
1541  buffer->CreateStorage();
1542  }
1543 
1544  DX11Buffer* dxBuffer = static_cast<DX11Buffer*>(Bind(buffer));
1545  return dxBuffer->Update(mImmediate);
1546 }
1547 
1548 bool DX11Engine::Update(std::shared_ptr<TextureSingle> const& texture)
1549 {
1550  if (!texture->GetData())
1551  {
1552  LogWarning("Texture does not have system memory, creating it.");
1553  texture->CreateStorage();
1554  }
1555 
1556  DX11Texture* dxTexture = static_cast<DX11Texture*>(Bind(texture));
1557  return dxTexture->Update(mImmediate);
1558 }
1559 
1560 bool DX11Engine::Update(std::shared_ptr<TextureSingle> const& texture, unsigned int level)
1561 {
1562  if (!texture->GetData())
1563  {
1564  LogWarning("Texture does not have system memory, creating it.");
1565  texture->CreateStorage();
1566  }
1567 
1568  DX11Texture* dxTexture = static_cast<DX11Texture*>(Bind(texture));
1569  unsigned int sri = texture->GetIndex(0, level);
1570  return dxTexture->Update(mImmediate, sri);
1571 }
1572 
1573 bool DX11Engine::Update(std::shared_ptr<TextureArray> const& textureArray)
1574 {
1575  if (!textureArray->GetData())
1576  {
1577  LogWarning("Texture array does not have system memory, creating it.");
1578  textureArray->CreateStorage();
1579  }
1580 
1581  DX11TextureArray* dxTextureArray = static_cast<DX11TextureArray*>(
1582  Bind(textureArray));
1583  return dxTextureArray->Update(mImmediate);
1584 }
1585 
1586 bool DX11Engine::Update(std::shared_ptr<TextureArray> const& textureArray, unsigned int item, unsigned int level)
1587 {
1588  if (!textureArray->GetData())
1589  {
1590  LogWarning("Texture array does not have system memory, creating it.");
1591  textureArray->CreateStorage();
1592  }
1593 
1594  DX11TextureArray* dxTextureArray = static_cast<DX11TextureArray*>(
1595  Bind(textureArray));
1596  unsigned int sri = textureArray->GetIndex(item, level);
1597  return dxTextureArray->Update(mImmediate, sri);
1598 }
1599 
1600 bool DX11Engine::CopyCpuToGpu(std::shared_ptr<Buffer> const& buffer)
1601 {
1602  if (!buffer->GetData())
1603  {
1604  LogWarning("Buffer does not have system memory, creating it.");
1605  buffer->CreateStorage();
1606  }
1607 
1608  DX11Buffer* dxBuffer = static_cast<DX11Buffer*>(Bind(buffer));
1609  return dxBuffer->CopyCpuToGpu(mImmediate);
1610 }
1611 
1612 bool DX11Engine::CopyCpuToGpu(std::shared_ptr<TextureSingle> const& texture)
1613 {
1614  if (!texture->GetData())
1615  {
1616  LogWarning("Texture does not have system memory, creating it.");
1617  texture->CreateStorage();
1618  }
1619 
1620  DX11Texture* dxTexture = static_cast<DX11Texture*>(Bind(texture));
1621  return dxTexture->CopyCpuToGpu(mImmediate);
1622 }
1623 
1624 bool DX11Engine::CopyCpuToGpu(std::shared_ptr<TextureSingle> const& texture, unsigned int level)
1625 {
1626  if (!texture->GetData())
1627  {
1628  LogWarning("Texture does not have system memory, creating it.");
1629  texture->CreateStorage();
1630  }
1631 
1632  DX11Texture* dxTexture = static_cast<DX11Texture*>(Bind(texture));
1633  unsigned int sri = texture->GetIndex(0, level);
1634  return dxTexture->CopyCpuToGpu(mImmediate, sri);
1635 }
1636 
1637 bool DX11Engine::CopyCpuToGpu(std::shared_ptr<TextureArray> const& textureArray)
1638 {
1639  if (!textureArray->GetData())
1640  {
1641  LogWarning("Texture array does not have system memory, creating it.");
1642  textureArray->CreateStorage();
1643  }
1644 
1645  DX11TextureArray* dxTextureArray = static_cast<DX11TextureArray*>(
1646  Bind(textureArray));
1647  return dxTextureArray->CopyCpuToGpu(mImmediate);
1648 }
1649 
1650 bool DX11Engine::CopyCpuToGpu(std::shared_ptr<TextureArray> const& textureArray, unsigned int item, unsigned int level)
1651 {
1652  if (!textureArray->GetData())
1653  {
1654  LogWarning("Texture array does not have system memory, creating it.");
1655  textureArray->CreateStorage();
1656  }
1657 
1658  DX11TextureArray* dxTextureArray = static_cast<DX11TextureArray*>(
1659  Bind(textureArray));
1660  unsigned int sri = textureArray->GetIndex(item, level);
1661  return dxTextureArray->CopyCpuToGpu(mImmediate, sri);
1662 }
1663 
1664 bool DX11Engine::CopyGpuToCpu(std::shared_ptr<Buffer> const& buffer)
1665 {
1666  if (!buffer->GetData())
1667  {
1668  LogWarning("Buffer does not have system memory, creating it.");
1669  buffer->CreateStorage();
1670  }
1671 
1672  DX11Buffer* dxBuffer = static_cast<DX11Buffer*>(Bind(buffer));
1673  return dxBuffer->CopyGpuToCpu(mImmediate);
1674 }
1675 
1676 bool DX11Engine::CopyGpuToCpu(std::shared_ptr<TextureSingle> const& texture)
1677 {
1678  if (!texture->GetData())
1679  {
1680  LogWarning("Texture does not have system memory, creating it.");
1681  texture->CreateStorage();
1682  }
1683 
1684  DX11Texture* dxTexture = static_cast<DX11Texture*>(Bind(texture));
1685  return dxTexture->CopyGpuToCpu(mImmediate);
1686 }
1687 
1688 bool DX11Engine::CopyGpuToCpu(std::shared_ptr<TextureSingle> const& texture, unsigned int level)
1689 {
1690  if (!texture->GetData())
1691  {
1692  LogWarning("Texture does not have system memory, creating it.");
1693  texture->CreateStorage();
1694  }
1695 
1696  DX11Texture* dxTexture = static_cast<DX11Texture*>(Bind(texture));
1697  unsigned int sri = texture->GetIndex(0, level);
1698  return dxTexture->CopyGpuToCpu(mImmediate, sri);
1699 }
1700 
1701 bool DX11Engine::CopyGpuToCpu(std::shared_ptr<TextureArray> const& textureArray)
1702 {
1703  if (!textureArray->GetData())
1704  {
1705  LogWarning("Texture array does not have system memory, creating it.");
1706  textureArray->CreateStorage();
1707  }
1708 
1709  DX11TextureArray* dxTextureArray = static_cast<DX11TextureArray*>(
1710  Bind(textureArray));
1711  return dxTextureArray->CopyGpuToCpu(mImmediate);
1712 }
1713 
1714 bool DX11Engine::CopyGpuToCpu(std::shared_ptr<TextureArray> const& textureArray, unsigned int item, unsigned int level)
1715 {
1716  if (!textureArray->GetData())
1717  {
1718  LogWarning("Texture array does not have system memory, creating it.");
1719  textureArray->CreateStorage();
1720  }
1721 
1722  DX11TextureArray* dxTextureArray = static_cast<DX11TextureArray*>(
1723  Bind(textureArray));
1724  unsigned int sri = textureArray->GetIndex(item, level);
1725  return dxTextureArray->CopyGpuToCpu(mImmediate, sri);
1726 }
1727 
1729  std::shared_ptr<Buffer> const& buffer0,
1730  std::shared_ptr<Buffer> const& buffer1)
1731 {
1732  DX11Buffer* dxBuffer0 = static_cast<DX11Buffer*>(Bind(buffer0));
1733  DX11Buffer* dxBuffer1 = static_cast<DX11Buffer*>(Bind(buffer1));
1734  dxBuffer0->CopyGpuToGpu(mImmediate, dxBuffer1->GetDXResource());
1735 }
1736 
1738  std::shared_ptr<TextureSingle> const& texture0,
1739  std::shared_ptr<TextureSingle> const& texture1)
1740 {
1741  DX11Texture* dxTexture0 = static_cast<DX11Texture*>(Bind(texture0));
1742  DX11Texture* dxTexture1 = static_cast<DX11Texture*>(Bind(texture1));
1743  dxTexture0->CopyGpuToGpu(mImmediate, dxTexture1->GetDXResource());
1744 }
1745 
1747  std::shared_ptr<TextureSingle> const& texture0,
1748  std::shared_ptr<TextureSingle> const& texture1,
1749  unsigned int level)
1750 {
1751  DX11Texture* dxTexture0 = static_cast<DX11Texture*>(Bind(texture0));
1752  DX11Texture* dxTexture1 = static_cast<DX11Texture*>(Bind(texture1));
1753  unsigned int sri = texture0->GetIndex(0, level);
1754  dxTexture0->CopyGpuToGpu(mImmediate, dxTexture1->GetDXResource(), sri);
1755 }
1756 
1758  std::shared_ptr<TextureArray> const& textureArray0,
1759  std::shared_ptr<TextureArray> const& textureArray1)
1760 {
1761  DX11TextureArray* dxTextureArray0 = static_cast<DX11TextureArray*>(Bind(textureArray0));
1762  DX11TextureArray* dxTextureArray1 = static_cast<DX11TextureArray*>(Bind(textureArray1));
1763  return dxTextureArray0->CopyGpuToGpu(mImmediate, dxTextureArray1->GetDXResource());
1764 }
1765 
1767  std::shared_ptr<TextureArray> const& textureArray0,
1768  std::shared_ptr<TextureArray> const& textureArray1,
1769  unsigned int item, unsigned int level)
1770 {
1771  DX11TextureArray* dxTextureArray0 = static_cast<DX11TextureArray*>(Bind(textureArray0));
1772  DX11TextureArray* dxTextureArray1 = static_cast<DX11TextureArray*>(Bind(textureArray1));
1773  unsigned int sri = textureArray0->GetIndex(item, level);
1774  return dxTextureArray0->CopyGpuToGpu(mImmediate, dxTextureArray1->GetDXResource(), sri);
1775 }
1776 
1777 bool DX11Engine::GetNumActiveElements(std::shared_ptr<StructuredBuffer> const& buffer)
1778 {
1779  DX11GraphicsObject* dxObject = static_cast<DX11GraphicsObject*>(Get(buffer));
1780  if (dxObject)
1781  {
1782  DX11StructuredBuffer* dxSBuffer =
1783  static_cast<DX11StructuredBuffer*>(dxObject);
1784  return dxSBuffer->GetNumActiveElements(mImmediate);
1785  }
1786  return false;
1787 }
1788 
1789 bool DX11Engine::BindProgram(std::shared_ptr<ComputeProgram> const& program)
1790 {
1791  auto hlslProgram = std::dynamic_pointer_cast<HLSLComputeProgram>(program);
1792  if (hlslProgram)
1793  {
1794  auto cshader = hlslProgram->GetCShader();
1795  if (cshader)
1796  {
1797  return GraphicsEngine::Bind(cshader) != nullptr;
1798  }
1799  }
1800  return false;
1801 }
1802 
1803 void DX11Engine::Execute(std::shared_ptr<ComputeProgram> const& program,
1804  unsigned int numXGroups, unsigned int numYGroups, unsigned int numZGroups)
1805 {
1806  auto hlslProgram = std::dynamic_pointer_cast<HLSLComputeProgram>(program);
1807  if (hlslProgram && numXGroups > 0 && numYGroups > 0 && numZGroups > 0)
1808  {
1809  auto cshader = hlslProgram->GetCShader();
1810  if (cshader)
1811  {
1812  DX11ComputeShader* dxCShader = static_cast<DX11ComputeShader*>(Bind(cshader));
1813  Enable(cshader.get(), dxCShader);
1814  mImmediate->Dispatch(numXGroups, numYGroups, numZGroups);
1815  Disable(cshader.get(), dxCShader);
1816  }
1817  else
1818  {
1819  LogError("Invalid input parameter.");
1820  }
1821  }
1822 }
1823 
1825 {
1826  if (!mWaitQuery)
1827  {
1828  D3D11_QUERY_DESC desc;
1829  desc.Query = D3D11_QUERY_EVENT;
1830  desc.MiscFlags = D3D11_QUERY_MISC_NONE;
1831  HRESULT hr = mDevice->CreateQuery(&desc, &mWaitQuery);
1832  CHECK_HR_RETURN_NONE("CreateQuery failed in WaitForFinish");
1833  }
1834 
1835  mImmediate->End(mWaitQuery);
1836  BOOL data = 0;
1837  UINT size = sizeof(BOOL);
1838  while (S_OK != mImmediate->GetData(mWaitQuery, &data, size, 0))
1839  {
1840  // Wait for end of query.
1841  }
1842 }
1843 
1845 {
1846  mImmediate->Flush();
1847 }
1848 
1849 //----------------------------------------------------------------------------
1850 // Public overrides from GraphicsEngine
1851 //----------------------------------------------------------------------------
1852 uint64_t DX11Engine::DrawPrimitive(std::shared_ptr<VertexBuffer> const& vbuffer,
1853  std::shared_ptr<IndexBuffer> const& ibuffer, std::shared_ptr<VisualEffect> const& effect)
1854 {
1855  uint64_t numPixelsDrawn = 0;
1856  DX11VertexShader* dxVShader;
1857  DX11GeometryShader* dxGShader;
1858  DX11PixelShader* dxPShader;
1859  if (EnableShaders(effect, dxVShader, dxGShader, dxPShader))
1860  {
1861  // Enable the vertex buffer and input layout.
1862  DX11VertexBuffer* dxVBuffer = nullptr;
1863  DX11InputLayout* dxLayout = nullptr;
1864  if (vbuffer->StandardUsage())
1865  {
1866  dxVBuffer = static_cast<DX11VertexBuffer*>(Bind(vbuffer));
1867  DX11InputLayoutManager* manager = static_cast<DX11InputLayoutManager*>(mILMap.get());
1868  dxLayout = manager->Bind(mDevice, vbuffer.get(), effect->GetVertexShader().get());
1869  dxVBuffer->Enable(mImmediate);
1870  dxLayout->Enable(mImmediate);
1871  }
1872  else
1873  {
1874  mImmediate->IASetInputLayout(nullptr);
1875  }
1876 
1877  // Enable the index buffer.
1878  DX11IndexBuffer* dxIBuffer = nullptr;
1879  if (ibuffer->IsIndexed())
1880  {
1881  dxIBuffer = static_cast<DX11IndexBuffer*>(Bind(ibuffer));
1882  dxIBuffer->Enable(mImmediate);
1883  }
1884 
1885  numPixelsDrawn = DrawPrimitive(vbuffer.get(), ibuffer.get());
1886 
1887  // Disable the vertex buffer and input layout.
1888  if (vbuffer->StandardUsage())
1889  {
1890  dxVBuffer->Disable(mImmediate);
1891  dxLayout->Disable(mImmediate);
1892  }
1893 
1894  // Disable the index buffer.
1895  if (dxIBuffer)
1896  {
1897  dxIBuffer->Disable(mImmediate);
1898  }
1899 
1900  DisableShaders(effect, dxVShader, dxGShader, dxPShader);
1901  }
1902  return numPixelsDrawn;
1903 }
DXGI_OUTPUT_DESC const & GetDescription() const
virtual void GetDepthRange(float &zmin, float &zmax) const override
virtual void DisableSampler(ID3D11DeviceContext *context, unsigned int bindPoint)=0
ID3D11UnorderedAccessView * GetUAView() const
virtual bool Resize(unsigned int w, unsigned int h) override
ThreadSafeMap< GraphicsObject const *, std::shared_ptr< GEObject > > mGOMap
void Unmap(std::shared_ptr< Resource > const &resource, unsigned int sri)
virtual void DisableSRView(ID3D11DeviceContext *context, unsigned int bindPoint)=0
void Enable(ID3D11DeviceContext *context)
std::shared_ptr< Font > mActiveFont
ID3D11SamplerState * GetDXSamplerState()
static int const shaderDataLookup
virtual void CopyGpuToGpu(ID3D11DeviceContext *context, ID3D11Resource *target) override
virtual void Flush() override
std::array< CreateGEObject, GT_NUM_TYPES > mCreateGEObject
static std::string defaultVersion
virtual bool CopyCpuToGpu(ID3D11DeviceContext *context) override
std::shared_ptr< RasterizerState > mActiveRasterizerState
ID3D11DepthStencilView * mDepthStencilView
DX11Engine(D3D_FEATURE_LEVEL minFeatureLevel=D3D_FEATURE_LEVEL_11_0)
GT_TEXTURE2
std::shared_ptr< BlendState > mActiveBlendState
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
void DisableTextures(Shader const *shader, DX11Shader *dxShader)
virtual void SetBlendState(std::shared_ptr< BlendState > const &state) override
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
IP_TRISTRIP_ADJ
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
CreateGEDrawTarget mCreateGEDrawTarget
#define D3D11_RESOURCE_MISC_NONE
void DestroyDefaultObjects()
#define LogAssert(condition, message)
Definition: GteLogger.h:86
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
IP_TRIMESH
static int const shaderDataLookup
void DisableShaders(std::shared_ptr< VisualEffect > const &effect, DX11VertexShader *dxVShader, DX11GeometryShader *dxGShader, DX11PixelShader *dxPShader)
D3D11_MAPPED_SUBRESOURCE MapForWrite(std::shared_ptr< Resource > const &resource, unsigned int sri)
#define CHECK_HR_RETURN_NONE(msg)
unsigned int GetOffset() const
Definition: GteResource.h:173
void DisableRBuffers(Shader const *shader, DX11Shader *dxShader)
void BeginTimer(DX11PerformanceCounter &counter)
virtual bool CopyGpuToCpu(ID3D11DeviceContext *context, unsigned int sri) override
ID3D11Query * BeginOcclusionQuery()
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
std::array< ID3D11RenderTargetView *, D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT > mActiveRT
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
virtual bool BindProgram(std::shared_ptr< ComputeProgram > const &program) override
GLint level
Definition: glcorearb.h:103
ID3D11Buffer * GetDXBuffer() const
Definition: GteDX11Buffer.h:74
HRESULT SetPrivateName(ID3D11DeviceChild *object, std::string const &name)
IP_TRIMESH_ADJ
void EndTimer(DX11PerformanceCounter &counter)
D3D11_VIEWPORT mViewport
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
void EnableTextures(Shader const *shader, DX11Shader *dxShader)
GT_TEXTURE_RT
GEObject * Get(std::shared_ptr< GraphicsObject > const &object) const
GLbitfield GLuint program
Definition: glcorearb.h:1926
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
unsigned int mXSize
Definition: GteBaseEngine.h:95
D3D_FEATURE_LEVEL mFeatureLevel
D3D11_VIEWPORT mSaveViewport
std::unique_ptr< GEInputLayoutManager > mILMap
virtual void SetViewport(int x, int y, int w, int h) override
void EnableRBuffers(Shader const *shader, DX11Shader *dxShader)
ID3D11UnorderedAccessView * GetUAView() const
GLuint const GLchar * name
Definition: glcorearb.h:781
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
virtual void ClearBuffers() override
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
void EnableTextureArrays(Shader const *shader, DX11Shader *dxShader)
static int const shaderDataLookup
uint64_t EndOcclusionQuery(ID3D11Query *occlusionQuery)
virtual ~DX11Engine()
IP_POLYSEGMENT_CONTIGUOUS_ADJ
void DisableTextureArrays(Shader const *shader, DX11Shader *dxShader)
GLenum target
Definition: glcorearb.h:1662
ID3D11Texture2D * mDepthStencilBuffer
GLint GLenum GLint x
Definition: glcorearb.h:404
GLsizeiptr size
Definition: glcorearb.h:659
static int const shaderDataLookup
std::shared_ptr< GOListener > mGOListener
ULONG FinalRelease(T *&object)
bool EnableShaders(std::shared_ptr< VisualEffect > const &effect, DX11VertexShader *&dxVShader, DX11GeometryShader *&dxGShader, DX11PixelShader *&dxPShader)
GLubyte GLubyte GLubyte GLubyte w
Definition: glcorearb.h:852
virtual void EnableUAView(ID3D11DeviceContext *context, unsigned int bindPoint, ID3D11UnorderedAccessView *uaView, unsigned int initialCount)=0
void Initialize(IDXGIAdapter *adapter, D3D_DRIVER_TYPE driverType, HMODULE softwareModule, UINT flags, D3D_FEATURE_LEVEL minFeatureLevel)
IP_POLYSEGMENT_CONTIGUOUS
virtual void SetDepthRange(float zmin, float zmax) override
HMODULE mSoftwareModule
uint32_t GetFirstIndex() const
virtual void DestroyDefaultGlobalState()
void Disable(Shader const *shader, DX11Shader *dxShader)
std::array< float, 4 > mClearColor
Definition: GteBaseEngine.h:98
void CreateDefaultObjects()
void EnableSBuffers(Shader const *shader, DX11Shader *dxShader)
virtual void Execute(std::shared_ptr< ComputeProgram > const &program, unsigned int numXGroups, unsigned int numYGroups, unsigned int numZGroups) override
virtual bool CopyCpuToGpu(ID3D11DeviceContext *context, unsigned int sri) override
unsigned int mClearStencil
static int const shaderDataLookup
Definition: GteRawBuffer.h:23
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
IDXGIOutput * GetOutput() const
DX11InputLayout * Bind(ID3D11Device *device, VertexBuffer const *vbuffer, Shader const *vshader)
GLuint counter
Definition: glext.h:5361
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
void Enable(Shader const *shader, DX11Shader *dxShader)
virtual bool Update(std::shared_ptr< Buffer > const &buffer) override
virtual void GetViewport(int &x, int &y, int &w, int &h) const override
bool GetKeepInternalCount() const
bool CreateBestMatchingDevice()
D3D_DRIVER_TYPE mDriverType
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
void Unmap(ID3D11DeviceContext *context, unsigned int sri)
ID3D11ShaderResourceView * GetSRView() const
void CreateDefaultGlobalState()
virtual void CopyGpuToGpu(ID3D11DeviceContext *context, ID3D11Resource *target, unsigned int sri) override
void Enable(ID3D11DeviceContext *context)
virtual bool GetNumActiveElements(std::shared_ptr< StructuredBuffer > const &buffer) override
uint64_t DrawPrimitive(VertexBuffer const *vbuffer, IndexBuffer const *ibuffer)
#define LogError(message)
Definition: GteLogger.h:92
ID3D11ShaderResourceView * GetSRView() const
IP_POLYSEGMENT_DISJOINT_ADJ
static std::shared_ptr< GEDrawTarget > Create(DrawTarget const *target, std::vector< GEObject * > &rtTextures, GEObject *dsTexture)
virtual void ClearColorBuffer() override
GLboolean * data
Definition: glcorearb.h:126
virtual bool Update(ID3D11DeviceContext *context, unsigned int sri) override
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
virtual void CopyGpuToGpu(std::shared_ptr< Buffer > const &buffer0, std::shared_ptr< Buffer > const &buffer1) override
void Disable(ID3D11DeviceContext *context)
IP_POLYSEGMENT_DISJOINT
GLuint texture
Definition: glcorearb.h:410
static int const shaderDataLookup
ID3D11RenderTargetView * mColorView
static void UnsubscribeForDestruction(std::shared_ptr< ListenerForDestruction > const &listener)
ThreadSafeMap< DrawTarget const *, std::shared_ptr< GEDrawTarget > > mDTMap
typedef BOOL(WINAPI *PFNWGLSAVEBUFFERREGIONARBPROC)(HANDLE hRegion
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
std::shared_ptr< DepthStencilState > mActiveDepthStencilState
void EnableSamplers(Shader const *shader, DX11Shader *dxShader)
void Enable(ID3D11DeviceContext *context)
#define LogWarning(message)
Definition: GteLogger.h:95
GLbitfield flags
Definition: glcorearb.h:1591
IDXGISwapChain * mSwapChain
IPType GetPrimitiveType() const
GLclampd zmax
Definition: glext.h:6450
void DisableCBuffers(Shader const *shader, DX11Shader *dxShader)
bool GetNumActiveElements(ID3D11DeviceContext *context)
void Disable(ID3D11DeviceContext *context)
IDXGIAdapter * mAdapter
virtual void WaitForFinish() override
virtual bool CopyCpuToGpu(std::shared_ptr< Buffer > const &buffer) override
unsigned int GetNumActiveElements() const
Definition: GteResource.h:178
bool IsFullscreen(DXGIOutput const &output) const
std::shared_ptr< Font > mDefaultFont
ID3D11DeviceContext * mImmediate
GEObject * Bind(std::shared_ptr< GraphicsObject > const &object)
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
std::map< std::wstring, bool > mFullscreenState
IP_POLYPOINT
bool IsIndexed() const
GLfloat GLfloat GLfloat GLfloat h
Definition: glcorearb.h:1997
GLuint shader
Definition: glcorearb.h:780
virtual void Enable(ID3D11DeviceContext *context)=0
ULONG SafeRelease(T *&object)
void DisableTBuffers(Shader const *shader, DX11Shader *dxShader)
D3D11_QUERY_DATA_TIMESTAMP_DISJOINT mTimeStamp
#define D3D11_CPU_ACCESS_NONE
virtual void EnableSampler(ID3D11DeviceContext *context, unsigned int bindPoint, ID3D11SamplerState *state)=0
void Enable(ID3D11DeviceContext *context)
ID3D11Resource * GetDXResource() const
void Disable(ID3D11DeviceContext *context)
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
void EnableTBuffers(Shader const *shader, DX11Shader *dxShader)
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
void Disable(ID3D11DeviceContext *context)
unsigned int mYSize
Definition: GteBaseEngine.h:95
GLuint index
Definition: glcorearb.h:781
ID3D11ShaderResourceView * GetSRView() const
virtual bool Update(ID3D11DeviceContext *context) override
void Enable(ID3D11DeviceContext *context)
IP_TRISTRIP
DX11Texture2 * BindTexture(std::shared_ptr< Texture2 > const &texture, ID3D11Texture2D *dxTexture, ID3D11ShaderResourceView *dxSRView)
#define D3D11_QUERY_MISC_NONE
ID3D11DepthStencilView * mSaveDS
ID3D11DepthStencilView * mActiveDS
virtual void ClearDepthBuffer() override
ID3D11Texture2D * mColorBuffer
virtual bool CopyGpuToCpu(std::shared_ptr< Buffer > const &buffer) override
bool CreateBackBuffer(UINT xSize, UINT ySize)
ID3D11Query * mWaitQuery
GLfloat f
Definition: glcorearb.h:1921
virtual void DisableUAView(ID3D11DeviceContext *context, unsigned int bindPoint)=0
unsigned int mNumActiveRTs
DX11GraphicsObject * Share(std::shared_ptr< Texture2 > const &texture, DX11Engine *engine)
virtual void DisplayColorBuffer(unsigned int syncInterval) override
virtual void EnableCBuffer(ID3D11DeviceContext *context, unsigned int bindPoint, ID3D11Buffer *buffer)=0
ID3D11UnorderedAccessView * GetUAView() const
void DisableSBuffers(Shader const *shader, DX11Shader *dxShader)
virtual void ClearStencilBuffer() override
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
ID3D11ShaderResourceView * GetSRView() const
void DisableSamplers(Shader const *shader, DX11Shader *dxShader)
void Enable(ID3D11DeviceContext *context)
typedef UINT(WINAPI *PFNWGLGETGPUIDSAMDPROC)(UINT maxCount
#define CHECK_HR_RETURN(msg, value)
void EnableCBuffers(Shader const *shader, DX11Shader *dxShader)
std::array< ID3D11RenderTargetView *, D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT > mSaveRT
GLuint buffer
Definition: glcorearb.h:655
virtual void DisableCBuffer(ID3D11DeviceContext *context, unsigned int bindPoint)=0
static int const shaderDataLookup
D3D11_MAPPED_SUBRESOURCE MapForWrite(ID3D11DeviceContext *context, unsigned int sri)
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
virtual void SetDepthStencilState(std::shared_ptr< DepthStencilState > const &state) override
void Enable(ID3D11DeviceContext *context)
static void UnsubscribeForDestruction(std::shared_ptr< ListenerForDestruction > const &listener)
void * dxObject
Definition: wglext.h:626
virtual bool CopyGpuToCpu(ID3D11DeviceContext *context) override
virtual void Disable(ID3D11DeviceContext *context)=0
virtual void SetRasterizerState(std::shared_ptr< RasterizerState > const &state) override
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
virtual void EnableSRView(ID3D11DeviceContext *context, unsigned int bindPoint, ID3D11ShaderResourceView *srView)=0
std::shared_ptr< DTListener > mDTListener
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
GLint y
Definition: glcorearb.h:98
bool SetFullscreen(DXGIOutput const &output, bool fullscreen)
ID3D11Device * mDevice
GLint GLint GLsizei GLint GLenum GLenum type
Definition: glcorearb.h:103
bool CreateSwapChain(HWND handle, UINT xSize, UINT ySize)
D3D_FEATURE_LEVEL mMinFeatureLevel
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
uint32_t GetNumActiveIndices() const
std::vector< Data > const & GetData(int lookup) const
Definition: GteShader.h:393
std::shared_ptr< ComputeShader > const & GetCShader() const


geometric_tools_engine
Author(s): Yijiang Huang
autogenerated on Thu Jul 18 2019 03:59:59