//-------------------------------------------------------------------------- void D3D12Renderer::Init() { m_spD3D12 = VE_NEW VeSharedLib(LIB_D3D12); if (!m_spD3D12->Load()) { THROW("Failed to load " LIB_D3D12 "."); } m_spDXGI = VE_NEW VeSharedLib(LIB_DXGI); if (!m_spDXGI->Load()) { THROW("Failed to load " LIB_DXGI "."); } m_spD3DCompiler = VE_NEW VeSharedLib(LIB_D3DCOMPLIER); if (!m_spD3DCompiler->Load()) { THROW("Failed to load " LIB_D3DCOMPLIER "."); } D3D12GetDebugInterface = (decltype(D3D12GetDebugInterface)) m_spD3D12->GetProc("D3D12GetDebugInterface"); if (!D3D12GetDebugInterface) { THROW("Failed to fetch function D3D12GetDebugInterface."); } D3D12CreateDevice = (decltype(D3D12CreateDevice)) m_spD3D12->GetProc("D3D12CreateDevice"); if (!D3D12CreateDevice) { THROW("Failed to fetch function D3D12CreateDevice."); } D3D12SerializeRootSignature = (decltype(D3D12SerializeRootSignature)) m_spD3D12->GetProc("D3D12SerializeRootSignature"); if (!D3D12SerializeRootSignature) { THROW("Failed to fetch function D3D12SerializeRootSignature."); } CreateDXGIFactory1 = (decltype(CreateDXGIFactory1)) m_spDXGI->GetProc("CreateDXGIFactory1"); if (!CreateDXGIFactory1) { THROW("Failed to fetch function CreateDXGIFactory1."); } D3DCompile = (decltype(D3DCompile)) m_spD3DCompiler->GetProc("D3DCompile"); if (!D3DCompile) { THROW("Failed to fetch function D3DCompile."); } # ifdef VE_DEBUG { ID3D12Debug* pkDebugController(nullptr); if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&pkDebugController)))) { pkDebugController->EnableDebugLayer(); } VE_SAFE_RELEASE(pkDebugController); } # endif if (VE_FAILED(CreateDXGIFactory1(IID_PPV_ARGS(&m_pkDXGIFactory)))) { THROW("Failed to create DXGI factory."); } if (m_pkDXGIFactory->EnumAdapters1(0, &m_pkDefaultAdapter) == DXGI_ERROR_NOT_FOUND) { THROW("Failed to get main adapter."); } if (VE_FAILED(D3D12CreateDevice(m_pkDefaultAdapter, D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&m_pkDevice)))) { THROW("Failed to create d3d12 device."); } m_kRTVHeap.Init(m_pkDevice); m_kDSVHeap.Init(m_pkDevice); m_kSRVHeap.Init(m_pkDevice); VeCoreLogI("D3D12Renderer created successfully."); }
void Compile(VeChar8* pcFileName, VeChar8* pcDstDir) { VeChar8* pcFile = VeStrrchr(pcFileName, '/'); VeSizeT stNum = pcFile - pcFileName; VeChar8 acBuffer[2048]; VeMemcpy(acBuffer, pcFileName, stNum); acBuffer[stNum] = 0; ++pcFile; VeFileDir kFile(acBuffer); VeChar8* pcContent; VeChar8* pcTemp = VeStrtok(pcDstDir, "/", &pcContent); VE_ASSERT(pcTemp && *pcTemp); VeFileDir kDstFile(pcTemp); pcTemp = VeStrtok(NULL, "/", &pcContent); while(pcTemp && *pcTemp) { kDstFile.Change(pcTemp); pcTemp = VeStrtok(NULL, "/", &pcContent); } VeBinaryIStreamPtr spStream = kFile.OpenSync(pcFile); VE_ASSERT(spStream); VeXMLDocument kDoc; (*spStream) >> kDoc; VE_ASSERT(!kDoc.Error()); VeXMLElement* pkRoot = kDoc.RootElement(); VeXMLElement* pkGroup = pkRoot->FirstChildElement("Group"); while(pkGroup) { VeXMLElement* pkShader = pkGroup->FirstChildElement(); while(pkShader) { const VeChar8* pcName = pkShader->Value(); const VeChar8* pcSrc = pkShader->GetAttribute("src"); const VeChar8* pcEntry = pkShader->GetAttribute("entry"); VeStringA kFile(acBuffer); kFile += '/'; kFile += pcSrc; VeVector<const VeChar8*> kProfileList; VeXMLElement* pkProfile = pkShader->FirstChildElement("Profile"); while(pkProfile) { const VeChar8* pcProfile = pkProfile->GetAttribute("value"); kProfileList.PushBack(pcProfile); pkProfile = pkProfile->NextSiblingElement("Profile"); } VeVector<D3D_SHADER_MACRO> kMacroList; VeXMLElement* pkMacro = pkShader->FirstChildElement("Macro"); while(pkMacro) { D3D_SHADER_MACRO kMac; kMac.Name = pkMacro->GetAttribute("name"); kMac.Definition = pkMacro->GetAttribute("define"); kMacroList.PushBack(kMac); pkMacro = pkMacro->NextSiblingElement("Macro"); } D3D_SHADER_MACRO kLast = {NULL, NULL}; kMacroList.PushBack(kLast); for(VeVector<const VeChar8*>::iterator it = kProfileList.Begin(); it != kProfileList.End(); ++it) { HRESULT hRes = S_OK; ID3DBlob* pkOut; ID3DBlob* pkErrorBlob; hRes = D3DX11CompileFromFile(kFile, kMacroList.Begin(), NULL, pcEntry, *it, D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_OPTIMIZATION_LEVEL3 | D3DCOMPILE_PACK_MATRIX_COLUMN_MAJOR, 0, NULL, &pkOut, &pkErrorBlob, NULL); if(VE_FAILED(hRes)) { if(pkErrorBlob) { VE_LOG_EString("HLSLComplier", (VeChar8*)pkErrorBlob->GetBufferPointer()); } } else { VeStringA kOutputName(pcName); kOutputName += '.'; kOutputName += *it; VeMemoryOStreamPtr spOutputStream = VE_NEW VeMemoryOStream(); spOutputStream->AddBlob(pkOut->GetBufferPointer(), pkOut->GetBufferSize()); kDstFile.WriteAsync(kOutputName, spOutputStream, g_kWriteDelegate); } VE_SAFE_RELEASE(pkOut); VE_SAFE_RELEASE(pkErrorBlob); } pkShader = pkShader->NextSiblingElement(); } pkGroup = pkGroup->NextSiblingElement("Group"); } }