void WorldObjectEffect::init(WorldObjectStore *oStore, UINT maxThreads, UINT maxNumObjects) { initialized = true; objectStore = oStore; oStore->setWorldObjectEffect(this); // try to do all expensive operations like shader loading and PSO creation here // Create the pipeline state, which includes compiling and loading shaders. { createRootSigAndPSO(rootSignature, pipelineState); cbvAlignedSize = calcConstantBufferSize((UINT)sizeof(cbv)); createConstantBuffer((UINT)2 * cbvAlignedSize, L"objecteffect_cbv_resource"); // TODO setSingleCBVMode(maxThreads, maxNumObjects, sizeof(cbv), L"objecteffect_cbvsingle_resource"); // set cbv data: XMMATRIX ident = XMMatrixIdentity(); XMStoreFloat4x4(&cbv.wvp, ident); cbv.world = cbv.wvp; //memcpy(cbvGPUDest+cbvAlignedSize, &cbv, sizeof(cbv)); } // Create command allocators and command lists for each frame. static LPCWSTR fence_names[XApp::FrameCount] = { L"fence_objecteffect_0", L"fence_objecteffect_1", L"fence_objecteffect_2" }; for (UINT n = 0; n < XApp::FrameCount; n++) { ThrowIfFailed(xapp().device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&commandAllocators[n]))); ThrowIfFailed(xapp().device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, commandAllocators[n].Get(), pipelineState.Get(), IID_PPV_ARGS(&commandLists[n]))); // Command lists are created in the recording state, but there is nothing // to record yet. The main loop expects it to be closed, so close it now. ThrowIfFailed(commandLists[n]->Close()); // init fences: //ThrowIfFailed(xapp().device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(frameData[n].fence.GetAddressOf()))); ThrowIfFailed(xapp().device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&frameData[n].fence))); frameData[n].fence->SetName(fence_names[n]); frameData[n].fenceValue = 0; frameData[n].fenceEvent = CreateEventEx(nullptr, FALSE, FALSE, EVENT_ALL_ACCESS); if (frameData[n].fenceEvent == nullptr) { ThrowIfFailed(HRESULT_FROM_WIN32(GetLastError())); } } // init resources for update thread: ThrowIfFailed(xapp().device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&updateCommandAllocator))); ThrowIfFailed(xapp().device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, updateCommandAllocator.Get(), pipelineState.Get(), IID_PPV_ARGS(&updateCommandList))); // Command lists are created in the recording state, but there is nothing // to record yet. The main loop expects it to be closed, so close it now. ThrowIfFailed(updateCommandList->Close()); // init fences: //ThrowIfFailed(xapp().device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(frameData[n].fence.GetAddressOf()))); ThrowIfFailed(xapp().device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&updateFrameData.fence))); updateFrameData.fence->SetName(L"fence_objecteffect_update"); updateFrameData.fenceValue = 0; updateFrameData.fenceEvent = CreateEventEx(nullptr, FALSE, FALSE, EVENT_ALL_ACCESS); if (updateFrameData.fenceEvent == nullptr) { ThrowIfFailed(HRESULT_FROM_WIN32(GetLastError())); } }
void ShaderManagerDX::createCBufferLights() { D3D11_BUFFER_DESC desc; ZeroMemory(&desc, sizeof(desc)); desc.Usage = D3D11_USAGE_DEFAULT; desc.ByteWidth = calcConstantBufferSize(sizeof(CBufferLights)); desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; desc.CPUAccessFlags = 0; HRESULT hr = device->CreateBuffer(&desc, NULL, &cBufferLights); if(FAILED(hr)) { MessageBox(NULL, "CBufferLights creation failed!", "Constant Buffer error!", MB_OK | MB_ICONEXCLAMATION); } devcon->PSSetConstantBuffers(1, 1, &cBufferLights); }