CmD3D11Driver.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include "CmD3D11Driver.h"
  2. #include "CmD3D11VideoModeList.h"
  3. namespace CamelotEngine
  4. {
  5. D3D11Driver::D3D11Driver( const D3D11Driver &ob )
  6. {
  7. mAdapterNumber = ob.mAdapterNumber;
  8. mAdapterIdentifier = ob.mAdapterIdentifier;
  9. mDesktopDisplayMode = ob.mDesktopDisplayMode;
  10. mVideoModeList = nullptr;
  11. mDXGIAdapter = ob.mDXGIAdapter;
  12. if(mDXGIAdapter)
  13. mDXGIAdapter->AddRef();
  14. init();
  15. }
  16. D3D11Driver::D3D11Driver(unsigned int adapterNumber, IDXGIAdapter* pDXGIAdapter)
  17. {
  18. mAdapterNumber = adapterNumber;
  19. mVideoModeList = nullptr;
  20. mDXGIAdapter = pDXGIAdapter;
  21. if(mDXGIAdapter)
  22. mDXGIAdapter->AddRef();
  23. // get the description of the adapter
  24. pDXGIAdapter->GetDesc(&mAdapterIdentifier);
  25. init();
  26. }
  27. D3D11Driver::~D3D11Driver()
  28. {
  29. for(UINT32 i = 0; i < mNumOutputs; i++)
  30. {
  31. if(mVideoModeList[i] != nullptr)
  32. CM_DELETE(mVideoModeList[i], D3D11VideoModeList, GenAlloc);
  33. }
  34. if(mVideoModeList != nullptr)
  35. CM_DELETE_ARRAY(mVideoModeList, D3D11VideoModeList*, mNumOutputs, GenAlloc);
  36. SAFE_RELEASE(mDXGIAdapter);
  37. }
  38. void D3D11Driver::init()
  39. {
  40. assert(mDXGIAdapter != nullptr);
  41. UINT32 outputIdx = 0;
  42. IDXGIOutput* output;
  43. while(mDXGIAdapter->EnumOutputs(outputIdx, &output) != DXGI_ERROR_NOT_FOUND)
  44. {
  45. outputIdx++;
  46. }
  47. mNumOutputs = outputIdx;
  48. mVideoModeList = CM_NEW_ARRAY(D3D11VideoModeList*, mNumOutputs, GenAlloc);
  49. for(UINT32 i = 0; i < mNumOutputs; i++)
  50. mVideoModeList[i] = CM_NEW(D3D11VideoModeList, GenAlloc) D3D11VideoModeList(this, i);
  51. }
  52. D3D11Driver& D3D11Driver::operator=(const D3D11Driver& ob)
  53. {
  54. mAdapterNumber = ob.mAdapterNumber;
  55. mAdapterIdentifier = ob.mAdapterIdentifier;
  56. mDesktopDisplayMode = ob.mDesktopDisplayMode;
  57. mVideoModeList = nullptr;
  58. if(ob.mDXGIAdapter)
  59. ob.mDXGIAdapter->AddRef();
  60. SAFE_RELEASE(mDXGIAdapter);
  61. mDXGIAdapter=ob.mDXGIAdapter;
  62. return *this;
  63. }
  64. String D3D11Driver::getDriverName() const
  65. {
  66. size_t size = wcslen(mAdapterIdentifier.Description);
  67. char* str = (char*)CM_NEW_BYTES((UINT32)(size + 1), ScratchAlloc);
  68. wcstombs(str, mAdapterIdentifier.Description, size);
  69. str[size] = '\0';
  70. String Description = str;
  71. CM_DELETE_BYTES(str, ScratchAlloc);
  72. return String(Description );
  73. }
  74. String D3D11Driver::getDriverDescription() const
  75. {
  76. size_t size = wcslen(mAdapterIdentifier.Description);
  77. char* str = (char*)CM_NEW_BYTES((UINT32)(size + 1), ScratchAlloc);
  78. wcstombs(str, mAdapterIdentifier.Description, size);
  79. str[size] = '\0';
  80. String driverDescription = str;
  81. CM_DELETE_BYTES(str, ScratchAlloc);
  82. StringUtil::trim(driverDescription);
  83. return driverDescription;
  84. }
  85. const D3D11VideoModeList* D3D11Driver::getVideoModeList(UINT32 adapterOutputIdx) const
  86. {
  87. assert(adapterOutputIdx >= 0 && adapterOutputIdx < mNumOutputs);
  88. return mVideoModeList[adapterOutputIdx];
  89. }
  90. }