CmD3D11Driver.cpp 3.2 KB

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