Guest User

Untitled

a guest
Jan 21st, 2018
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.93 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "GlobalClassForStuff.h"
  3.  
  4.  
  5. GlobalStuff::GlobalStuff(void)
  6. {
  7. }
  8.  
  9. GlobalStuff::~GlobalStuff(void)
  10. {
  11. }
  12.  
  13. bool GlobalStuff::initAll(void)
  14. {
  15. CreateDXGIFactory1(__uuidof(IDXGIFactory1),reinterpret_cast<void**>(&mFactory));
  16. mFactory->EnumAdapters1(0,&mAdapter);
  17.  
  18. IDXGIOutputPtr pOutput;
  19. mAdapter->EnumOutputs(0,&pOutput);
  20.  
  21. UINT numModes;
  22. std::vector<DXGI_MODE_DESC> tempModes;
  23. pOutput->GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM,0,&numModes,0);
  24. tempModes.resize(numModes);
  25. pOutput->GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM,0,&numModes,tempModes.data());
  26.  
  27. CString poop;
  28. for(auto i = tempModes.begin();i < tempModes.end();i++)
  29. {
  30. poop.Format(L"%ux%u@%u/%u",(*i).Width,(*i).Height,(*i).RefreshRate.Numerator,(*i).RefreshRate.Denominator);
  31. mModes.insert(std::make_pair(poop,(*i)));
  32. }
  33.  
  34. D3D11CreateDevice(mAdapter,D3D_DRIVER_TYPE_UNKNOWN,0,0,0,0,D3D11_SDK_VERSION,&md3dDevice,0,&md3dDeviceContext);
  35.  
  36. D3DX11CreateThreadPump(0,0,&mThreadPump);
  37.  
  38. if(!initEffects())
  39. {
  40. return false;
  41. }
  42.  
  43. initInputLayouts();
  44.  
  45. return true;
  46. }
  47.  
  48. bool GlobalStuff::initEffects(void)
  49. {
  50. char tempString[MAX_PATH];
  51. std::vector<CString> shaderNames;
  52. std::vector<CComPtr<ID3DX11ThreadPump> > threadPumps;
  53. std::vector<ID3DBlobPtr> tempBlobs;
  54. std::vector<CComPtr<ID3DX11Effect> > tempEffects;
  55. std::ifstream input("./Shaders/ShaderList.txt",std::ios::in);
  56.  
  57. input.getline(tempString,MAX_PATH);
  58. int shaderCount = atoi(tempString);
  59.  
  60. shaderNames.resize(shaderCount);
  61. threadPumps.resize(shaderCount,CComPtr<ID3DX11ThreadPump>(nullptr));
  62. tempEffects.resize(shaderCount,CComPtr<ID3DX11Effect>(nullptr));
  63. tempBlobs.resize(shaderCount,ID3DBlobPtr(nullptr));
  64.  
  65. std::vector<ID3DBlobPtr> errors(shaderCount,ID3DBlobPtr(nullptr));
  66. std::vector<HRESULT> asyncResult(shaderCount,S_OK);
  67.  
  68. for(int i=0;i<shaderCount;i++)
  69. {
  70. input.getline(tempString,MAX_PATH);
  71.  
  72. shaderNames[i] = CString(tempString);
  73.  
  74. D3DX11CreateThreadPump(0,0,&(threadPumps[i]));
  75. }
  76.  
  77. input.close();
  78.  
  79. D3D_SHADER_MACRO macros[2] = {"CONTROL_POINT_SIZE","0",nullptr,nullptr};
  80. Concurrency::parallel_for(int(0),shaderCount,[&](int i){
  81. D3DX11CompileFromFile(shaderNames[i],macros,&mIncludeTool,nullptr,"fx_5_0",D3DCOMPILE_OPTIMIZATION_LEVEL3,0,threadPumps[i],
  82. &(tempBlobs[i]),&(errors[i]),&(asyncResult[i]));
  83. threadPumps[i]->WaitForAllItems();
  84. });
  85.  
  86. auto iterator = std::find(asyncResult.begin(),asyncResult.end(),E_FAIL);
  87. if(iterator != asyncResult.end())
  88. {
  89. CString poop;
  90. for(auto i=errors.begin();i!=errors.end();i++)
  91. {
  92. if(*i)
  93. {
  94. poop.Preallocate(static_cast<int>((*i)->GetBufferSize()));
  95. poop += static_cast<const char*>((*i)->GetBufferPointer());
  96. poop += "\n\n";
  97. }
  98. }
  99. AfxGetMainWnd()->GetTopLevelParent()->MessageBox(poop);
  100.  
  101. return false;
  102. }
  103.  
  104. Concurrency::parallel_for(int(0),shaderCount,[&](int i){
  105. D3DX11CreateEffectFromMemory(tempBlobs[i]->GetBufferPointer(),tempBlobs[i]->GetBufferSize(),0,md3dDevice,&(tempEffects[i]));
  106. });
  107.  
  108. for(int i=0;i<shaderCount;i++)
  109. {
  110. mEffects.insert(std::make_pair(shaderNames[i],tempEffects[i]));
  111. }
  112.  
  113. return true;
  114. }
  115.  
  116. void GlobalStuff::initInputLayouts(void)
  117. {
  118. D3DX11_PASS_DESC passDesc;
  119.  
  120. std::vector<std::vector<D3D11_INPUT_ELEMENT_DESC> > vertexDesc;
  121. vertexDesc.resize(2);
  122. vertexDesc[0].resize(1);
  123. vertexDesc[1].resize(2);
  124.  
  125. vertexDesc[0][0].SemanticName = "POSITION";
  126. vertexDesc[0][0].SemanticIndex = 0;
  127. vertexDesc[0][0].Format = DXGI_FORMAT_R32G32B32_FLOAT;
  128. vertexDesc[0][0].AlignedByteOffset = 0;
  129. vertexDesc[0][0].InputSlot = 0;
  130. vertexDesc[0][0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
  131. vertexDesc[0][0].InstanceDataStepRate = 0;
  132.  
  133. vertexDesc[1][0].SemanticName = "POSITION";
  134. vertexDesc[1][0].SemanticIndex = 0;
  135. vertexDesc[1][0].Format = DXGI_FORMAT_R32G32B32_FLOAT;
  136. vertexDesc[1][0].AlignedByteOffset = 0;
  137. vertexDesc[1][0].InputSlot = 0;
  138. vertexDesc[1][0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
  139. vertexDesc[1][0].InstanceDataStepRate = 0;
  140.  
  141. vertexDesc[1][1].SemanticName = "TEXCOORD";
  142. vertexDesc[1][1].SemanticIndex = 0;
  143. vertexDesc[1][1].Format = DXGI_FORMAT_R32G32_FLOAT;
  144. vertexDesc[1][1].AlignedByteOffset = 12;
  145. vertexDesc[1][1].InputSlot = 0;
  146. vertexDesc[1][1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
  147. vertexDesc[1][1].InstanceDataStepRate = 0;
  148.  
  149. auto iterator = mEffects.find(L"./Shaders/UntexturedFillrate/UntexturedFillrate.fx");
  150. (*iterator).second->GetTechniqueByName("UntexturedFillrateSM50")->GetPassByIndex(0)->GetDesc(&passDesc);
  151.  
  152. auto iterator1 = mInputLayouts.insert(std::make_pair(CString(L"Pos"),ID3D11InputLayoutPtr(nullptr)));
  153. md3dDevice->CreateInputLayout(vertexDesc[0].data(),1,passDesc.pIAInputSignature,passDesc.IAInputSignatureSize,&(iterator1.first->second));
  154.  
  155. iterator = mEffects.find(L"./Shaders/TexturedFillrate/TexturedFillrate.fx");
  156. (*iterator).second->GetTechniqueByName("TexturedFillrateSM50")->GetPassByIndex(0)->GetDesc(&passDesc);
  157.  
  158. iterator1 = mInputLayouts.insert(std::make_pair(CString(L"PosTex"),ID3D11InputLayoutPtr(nullptr)));
  159. md3dDevice->CreateInputLayout(vertexDesc[1].data(),2,passDesc.pIAInputSignature,passDesc.IAInputSignatureSize,&(iterator1.first->second));
  160. }
  161.  
  162. const CComPtr<ID3DX11Effect>& GlobalStuff::getEffect(const CString& shader) const
  163.  
  164. {
  165. auto iterator = mEffects.find(shader);
  166.  
  167. if(iterator != mEffects.end())
  168. {
  169. return (*iterator).second;
  170. }
  171.  
  172. return nullptr;
  173. }
  174.  
  175. const DXGI_MODE_DESC& GlobalStuff::getMode(const CString& mode) const
  176.  
  177. {
  178. auto iterator = mModes.find(mode);
  179.  
  180. if(iterator != mModes.end())
  181. {
  182. return (*iterator).second;
  183. }
  184.  
  185. DXGI_MODE_DESC failDesc;
  186. ZeroMemory(&failDesc,sizeof(DXGI_MODE_DESC));
  187. return failDesc;
  188. }
  189.  
  190. const ID3D11InputLayoutPtr& GlobalStuff::getInputLayout(const CString& layout) const
  191.  
  192. {
  193. auto iterator = mInputLayouts.find(layout);
  194.  
  195. if(iterator != mInputLayouts.end())
  196. {
  197. return (*iterator).second;
  198. }
  199.  
  200. return nullptr;
  201. }
  202.  
  203. bool GlobalStuff::recompileShader(const CString& shader,const D3D_SHADER_MACRO* macros = nullptr)
  204. {
  205. auto iterator = mEffects.find(shader);
  206.  
  207. if(iterator != mEffects.end())
  208. {
  209. ID3DBlobPtr shaderError, tempBlob;
  210. HRESULT asyncResult;
  211.  
  212. D3DX11CompileFromFile(shader,macros,&mIncludeTool,nullptr,"fx_5_0",D3DCOMPILE_OPTIMIZATION_LEVEL3,0,mThreadPump,&tempBlob,&shaderError,&asyncResult);
  213. mThreadPump->WaitForAllItems();
  214.  
  215. if(asyncResult == E_FAIL)
  216. {
  217. CString poop;
  218. if(shaderError)
  219. {
  220. poop.Preallocate(static_cast<int>(shaderError->GetBufferSize()) + 1);
  221. poop += static_cast<const char*>(shaderError->GetBufferPointer());
  222. poop += '\n';
  223. }
  224. AfxGetMainWnd()->GetTopLevelParent()->MessageBox(poop);
  225.  
  226. return false;
  227. }
  228.  
  229. D3DX11CreateEffectFromMemory(tempBlob->GetBufferPointer(),tempBlob->GetBufferSize(),0,md3dDevice,&(*iterator).second);
  230. // D3DX11CreateEffectFromMemory(tempBlob->GetBufferPointer(),tempBlob->GetBufferSize(),0,md3dDevice,&tempFX);
  231. return true;
  232. }
  233.  
  234. return false;
  235. }
Add Comment
Please, Sign In to add comment