void D3D11RenderTarget::bind() { MLIB_ASSERT(m_targets != nullptr); auto &context = m_graphics->getContext(); context.OMSetRenderTargets(getNumTargets(), m_targetsRTV, m_depthStencilDSV); D3D11_VIEWPORT viewport; viewport.Width = (FLOAT)m_width; viewport.Height = (FLOAT)m_height; viewport.MinDepth = 0.0f; viewport.MaxDepth = 1.0f; viewport.TopLeftX = 0; viewport.TopLeftY = 0; context.RSSetViewports(1, &viewport); }
void CUDASolverBundling::solve(EntryJ* d_correspondences, unsigned int numberOfCorrespondences, const int* d_validImages, unsigned int numberOfImages, unsigned int nNonLinearIterations, unsigned int nLinearIterations, const CUDACache* cudaCache, const std::vector<float>& weightsSparse, const std::vector<float>& weightsDenseDepth, const std::vector<float>& weightsDenseColor, bool usePairwiseDense, float3* d_rotationAnglesUnknowns, float3* d_translationUnknowns, bool rebuildJT, bool findMaxResidual, unsigned int revalidateIdx) { nNonLinearIterations = std::min(nNonLinearIterations, (unsigned int)weightsSparse.size()); MLIB_ASSERT(numberOfImages > 1 && nNonLinearIterations > 0); if (numberOfCorrespondences > m_maxCorrPerImage*m_maxNumberOfImages) { //warning: correspondences will be invalidated AT RANDOM! std::cerr << "WARNING: #corr (" << numberOfCorrespondences << ") exceeded limit (" << m_maxCorrPerImage << "*" << m_maxNumberOfImages << "), please increase max #corr per image in the GAS" << std::endl; } float* convergence = NULL; if (m_bRecordConvergence) { m_convergence.resize(nNonLinearIterations + 1, -1.0f); convergence = m_convergence.data(); } m_solverState.d_xRot = d_rotationAnglesUnknowns; m_solverState.d_xTrans = d_translationUnknowns; SolverParameters parameters = m_defaultParams; parameters.nNonLinearIterations = nNonLinearIterations; parameters.nLinIterations = nLinearIterations; parameters.verifyOptDistThresh = m_verifyOptDistThresh; parameters.verifyOptPercentThresh = m_verifyOptPercentThresh; parameters.highResidualThresh = std::numeric_limits<float>::infinity(); parameters.weightSparse = weightsSparse.front(); parameters.weightDenseDepth = weightsDenseDepth.front(); parameters.weightDenseColor = weightsDenseColor.front(); parameters.useDense = (parameters.weightDenseDepth > 0 || parameters.weightDenseColor > 0); parameters.useDenseDepthAllPairwise = usePairwiseDense; SolverInput solverInput; solverInput.d_correspondences = d_correspondences; solverInput.d_variablesToCorrespondences = d_variablesToCorrespondences; solverInput.d_numEntriesPerRow = d_numEntriesPerRow; solverInput.numberOfImages = numberOfImages; solverInput.numberOfCorrespondences = numberOfCorrespondences; solverInput.maxNumberOfImages = m_maxNumberOfImages; solverInput.maxCorrPerImage = m_maxCorrPerImage; solverInput.maxNumDenseImPairs = m_maxNumDenseImPairs; solverInput.weightsSparse = weightsSparse.data(); solverInput.weightsDenseDepth = weightsDenseDepth.data(); solverInput.weightsDenseColor = weightsDenseColor.data(); solverInput.d_validImages = d_validImages; if (cudaCache) { solverInput.d_cacheFrames = cudaCache->getCacheFramesGPU(); solverInput.denseDepthWidth = cudaCache->getWidth(); //TODO constant buffer for this? solverInput.denseDepthHeight = cudaCache->getHeight(); mat4f intrinsics = cudaCache->getIntrinsics(); solverInput.intrinsics = make_float4(intrinsics(0, 0), intrinsics(1, 1), intrinsics(0, 2), intrinsics(1, 2)); MLIB_ASSERT(solverInput.denseDepthWidth / parameters.denseOverlapCheckSubsampleFactor > 8); //need enough samples } else { solverInput.d_cacheFrames = NULL; solverInput.denseDepthWidth = 0; solverInput.denseDepthHeight = 0; solverInput.intrinsics = make_float4(-std::numeric_limits<float>::infinity()); } #ifdef NEW_GUIDED_REMOVE convertLiePosesToMatricesCU(m_solverState.d_xRot, m_solverState.d_xTrans, solverInput.numberOfImages, d_transforms, m_solverState.d_xTransformInverses); //debugging only (store transforms before opt) #endif #ifdef DEBUG_PRINT_SPARSE_RESIDUALS if (findMaxResidual) { float residualBefore = EvalResidual(solverInput, m_solverState, parameters, NULL); computeMaxResidual(solverInput, parameters, (unsigned int)-1); vec2ui beforeMaxImageIndices; float beforeMaxRes; unsigned int curFrame = (revalidateIdx == (unsigned int)-1) ? solverInput.numberOfImages - 1 : revalidateIdx; getMaxResidual(curFrame, d_correspondences, beforeMaxImageIndices, beforeMaxRes); std::cout << "\tbefore: (" << solverInput.numberOfImages << ") sumres = " << residualBefore << " / " << solverInput.numberOfCorrespondences << " = " << residualBefore / (float)solverInput.numberOfCorrespondences << " | maxres = " << beforeMaxRes << " images (" << beforeMaxImageIndices << ")" << std::endl; } #endif if (rebuildJT) { buildVariablesToCorrespondencesTable(d_correspondences, numberOfCorrespondences); } //if (cudaCache) { // cudaCache->printCacheImages("debug/cache/"); // int a = 5; //} solveBundlingStub(solverInput, m_solverState, parameters, m_solverExtra, convergence, m_timer); if (findMaxResidual) { computeMaxResidual(solverInput, parameters, revalidateIdx); #ifdef DEBUG_PRINT_SPARSE_RESIDUALS float residualAfter = EvalResidual(solverInput, m_solverState, parameters, NULL); vec2ui afterMaxImageIndices; float afterMaxRes; unsigned int curFrame = (revalidateIdx == (unsigned int)-1) ? solverInput.numberOfImages - 1 : revalidateIdx; getMaxResidual(curFrame, d_correspondences, afterMaxImageIndices, afterMaxRes); std::cout << "\tafter: (" << solverInput.numberOfImages << ") sumres = " << residualAfter << " / " << solverInput.numberOfCorrespondences << " = " << residualAfter / (float)solverInput.numberOfCorrespondences << " | maxres = " << afterMaxRes << " images (" << afterMaxImageIndices << ")" << std::endl; #endif } }