// Constrói o Moral Graph Graph* buildBNMoralGraph (int nxr, int* xr, BayesNet* bayesnet) { Graph* subgraph; Graph* moral; // Variáveis auxiliares Vertex* vertex; VertexNode* current; VertexLinkedList* children; int* varmap; // Mapea as variáveis da rede antiga para a subrede int i,j; // Aloca o espaço para o mapa de variáveis varmap = malloc(bnsize(bayesnet)*sizeof(int)); // Inicializa o mapa de variáveis for (i=0;i<bnsize(bayesnet);i++) varmap[i] = 0; // 1. Constroi o subgrafo - mantendo os ids dos nós // Inicializa o subgraph subgraph = newGraph(DIRECTED_GRAPH); // Percore o vetor de variáveis requireds e cria os vértices da subrede for (i=0;i<nxr;i++) { // Atualiza o mapa de variáveis indicando que o nó/variável é requirida varmap[xr[i]] = 1; // inclui o nó na rede vertex = buildVertex(xr[i],bayesnet->variables[xr[i]]->name); addVertex(&subgraph,&vertex); } for (i=0;i<nxr;i++) { // Estabelece as ligações vertex = getVertex(&bayesnet->graph,xr[i]); current = getVertexChildren(vertex)->first; while (current!=NULL) { if (varmap[current->vertex->id]==1) addArcByIds(&subgraph,xr[i],current->vertex->id); current = current->next; } } // 2. Gera o Moral Graph para o subgraph moral = buildMoralGraph(subgraph); // Desloca os espaços da memória; // Mapa de variáveis free(varmap); varmap = NULL; // Destroy o subgraph destroyGraph(&subgraph); subgraph = NULL; return moral; }
/** \fn openGlVertex \brief constructor */ openGlVertex::openGlVertex( ADM_coreVideoFilter *in,CONFcouple *setup) : ADM_coreVideoFilterQtGl(in,setup) { UNUSED_ARG(setup); widget->makeCurrent(); fboY->bind(); printf("Compiling shader \n"); // vertex shader // frag shader glProgramY = new QGLShaderProgram(context); ADM_assert(glProgramY); #if 1 if ( !glProgramY->addShaderFromSourceCode(QGLShader::Vertex, myVertex)) { ADM_error("[GL Render] Vertex log: %s\n", glProgramY->log().toUtf8().constData()); ADM_assert(0); } #endif if ( !glProgramY->addShaderFromSourceCode(QGLShader::Fragment, myShaderY)) { ADM_error("[GL Render] Fragment log: %s\n", glProgramY->log().toUtf8().constData()); ADM_assert(0); } if ( !glProgramY->link()) { ADM_error("[GL Render] Link log: %s\n", glProgramY->log().toUtf8().constData()); ADM_assert(0); } if ( !glProgramY->bind()) { ADM_error("[GL Render] Binding FAILED\n"); ADM_assert(0); } glList=glGenLists(1); buildVertex(); fboY->release(); widget->doneCurrent(); }
void buildStream(const STREAMOUT_COMPILE_STATE& state, const STREAMOUT_STREAM& streamState, Value* pSoCtx, BasicBlock* returnBB, Function* soFunc) { // get list of active SO buffers std::unordered_set<uint32_t> activeSOBuffers; for (uint32_t d = 0; d < streamState.numDecls; ++d) { const STREAMOUT_DECL& decl = streamState.decl[d]; activeSOBuffers.insert(decl.bufferIndex); } // always increment numPrimStorageNeeded Value *numPrimStorageNeeded = LOAD(pSoCtx, { 0, SWR_STREAMOUT_CONTEXT_numPrimStorageNeeded }); numPrimStorageNeeded = ADD(numPrimStorageNeeded, C(1)); STORE(numPrimStorageNeeded, pSoCtx, { 0, SWR_STREAMOUT_CONTEXT_numPrimStorageNeeded }); // check OOB on active SO buffers. If any buffer is out of bound, don't write // the primitive to any buffer Value* oobMask = C(false); for (uint32_t buffer : activeSOBuffers) { oobMask = OR(oobMask, oob(state, pSoCtx, buffer)); } BasicBlock* validBB = BasicBlock::Create(JM()->mContext, "valid", soFunc); // early out if OOB COND_BR(oobMask, returnBB, validBB); IRB()->SetInsertPoint(validBB); Value* numPrimsWritten = LOAD(pSoCtx, { 0, SWR_STREAMOUT_CONTEXT_numPrimsWritten }); numPrimsWritten = ADD(numPrimsWritten, C(1)); STORE(numPrimsWritten, pSoCtx, { 0, SWR_STREAMOUT_CONTEXT_numPrimsWritten }); // compute start pointer for each output buffer Value* pOutBuffer[4]; Value* pOutBufferStartVertex[4]; Value* outBufferPitch[4]; for (uint32_t b: activeSOBuffers) { Value* pBuf = getSOBuffer(pSoCtx, b); Value* pData = LOAD(pBuf, { 0, SWR_STREAMOUT_BUFFER_pBuffer }); Value* streamOffset = LOAD(pBuf, { 0, SWR_STREAMOUT_BUFFER_streamOffset }); pOutBuffer[b] = GEP(pData, streamOffset); pOutBufferStartVertex[b] = pOutBuffer[b]; outBufferPitch[b] = LOAD(pBuf, { 0, SWR_STREAMOUT_BUFFER_pitch }); } // loop over the vertices of the prim Value* pStreamData = LOAD(pSoCtx, { 0, SWR_STREAMOUT_CONTEXT_pPrimData }); for (uint32_t v = 0; v < state.numVertsPerPrim; ++v) { buildVertex(streamState, pStreamData, pOutBuffer); // increment stream and output buffer pointers // stream verts are always 32*4 dwords apart pStreamData = GEP(pStreamData, C(KNOB_NUM_ATTRIBUTES * 4)); // output buffers offset using pitch in buffer state for (uint32_t b : activeSOBuffers) { pOutBufferStartVertex[b] = GEP(pOutBufferStartVertex[b], outBufferPitch[b]); pOutBuffer[b] = pOutBufferStartVertex[b]; } } // update each active buffer's streamOffset for (uint32_t b : activeSOBuffers) { Value* pBuf = getSOBuffer(pSoCtx, b); Value* streamOffset = LOAD(pBuf, { 0, SWR_STREAMOUT_BUFFER_streamOffset }); streamOffset = ADD(streamOffset, MUL(C(state.numVertsPerPrim), outBufferPitch[b])); STORE(streamOffset, pBuf, { 0, SWR_STREAMOUT_BUFFER_streamOffset }); } }