void GLIndexArray::compile() { m_IsCompiled = true; if (0 != m_InternalIndexArray && m_InternalIndexArray->size() != 0) { std::shared_ptr<std::vector<unsigned int>> pArray; if (m_UseAdjacency) { buildAdjacencyList(); pArray = m_AdjIndexArray; } else pArray = m_InternalIndexArray; IBuffer *b = NULL; if (m_GLBuffer == 0) { b = RESOURCEMANAGER->createBuffer(m_Name); b->setStructure(std::vector < Enums::DataType > {Enums::UINT}); m_GLBuffer = b->getPropi(IBuffer::ID); } else { b = RESOURCEMANAGER->getBuffer(m_Name); } b->setData(pArray->size() * sizeof(unsigned int), &(*pArray)[0]); //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_GLBuffer); //glBufferData(GL_ELEMENT_ARRAY_BUFFER, pArray->size() * sizeof(unsigned int), &(*pArray)[0], GL_STATIC_DRAW); //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); //b->setPropui(IBuffer::SIZE, pArray->size() * sizeof(unsigned int)); } }
bool GLVertexArray::compile (void) { if (m_IsCompiled) return false; m_IsCompiled = true; for (int i = 0; i < VertexData::MaxAttribs; i++){ if (0 != m_InternalArrays[i] && m_InternalArrays[i]->size() != 0){ std::shared_ptr<std::vector<VertexData::Attr>> &pArray = m_InternalArrays[i]; IBuffer *b = NULL; std::string s = m_Name + ":" + VertexData::Syntax[i]; if (m_GLBuffers[i] == 0) { b = RESOURCEMANAGER->createBuffer(s); b->setStructure(std::vector < Enums::DataType > {Enums::FLOAT, Enums::FLOAT, Enums::FLOAT, Enums::FLOAT}); m_GLBuffers[i] = b->getPropi(IBuffer::ID); } else { b = RESOURCEMANAGER->getBuffer(s); } b->setData(pArray->size() * 4 * sizeof(float), (float*)&(*pArray)[0]); } } return true; }
void DlgDbgBuffers::setBufferList(){ std::vector<std::string> names; IBuffer *b; wxPGProperty *pid, *appended; std::string indexName, shortName, fullName; pgBuffers->ClearPage(0); bufferSettingsList.clear(); currentBuffer = NO_BUFFER; RESOURCEMANAGER->getBufferNames(&names); for (auto name : names) { fullName = name; shortName = File::GetName(name); if (m_UseShortNames) indexName = shortName; else indexName = fullName; b = RESOURCEMANAGER->getBuffer(name); b->refreshBufferParameters(); std::vector<Enums::DataType> structure = b->getStructure(); bufferSettingsList[indexName] = BufferSettings(); if (structure.size() == 0) bufferSettingsList[indexName].types.push_back(Enums::FLOAT); else bufferSettingsList[indexName].types = b->getStructure(); bufferSettingsList[indexName].lines = 16; bufferSettingsList[indexName].currentPage = 0; bufferSettingsList[indexName].ID = b->getPropi(IBuffer::ID); bufferSettingsList[indexName].size = b->getPropui(IBuffer::SIZE); bufferSettingsList[indexName].bufferPtr = b; bufferSettingsList[indexName].fullName = fullName; bufferSettingsList[indexName].shortName = shortName; int s = 0; for (auto t : bufferSettingsList[indexName].types) { s += Enums::getSize(t); } bufferSettingsList[indexName].lineSize = s; int totalLines = bufferSettingsList[indexName].size / s; if (bufferSettingsList[indexName].size % s != 0) totalLines++; int totalPages = totalLines / (bufferSettingsList[indexName].lines); if (totalLines % bufferSettingsList[indexName].lines != 0) totalPages++; pid = pgBuffers->Append(new wxStringProperty(wxT("" + indexName), wxPG_LABEL,"<composed>")); appended = pgBuffers->AppendIn(pid, new wxIntProperty(wxT("ID"), wxPG_LABEL, bufferSettingsList[indexName].ID)); appended->Enable(false); appended = pgBuffers->AppendIn(pid, new wxIntProperty(wxT("Size (bytes)"), wxPG_LABEL, bufferSettingsList[indexName].size)); appended->Enable(false); appended = pgBuffers->AppendIn(pid, new wxIntProperty(wxT("Total pages"), wxPG_LABEL, totalPages)); appended->Enable(false); appended = pgBuffers->AppendIn(pid, new wxIntProperty(wxT("Total lines"), wxPG_LABEL, totalLines)); appended->Enable(false); appended = pgBuffers->AppendIn(pid, new wxIntProperty(wxT("Components"), wxPG_LABEL, bufferSettingsList[indexName].types.size())); appended->Enable(false); } if (bufferSettingsList.size() > 0) currentBuffer = m_UseShortNames ? File::GetName(names[0]):indexName; pgBuffers->CollapseAll(); }
void PassOptixPrime::initOptixPrime() { // Create Context CHK_PRIME(rtpContextCreate(RTP_CONTEXT_TYPE_CUDA, &m_Context)); // Create Vertex Buffer std::shared_ptr<IRenderable> &renderable = RENDERMANAGER->getScene(m_SceneVector[0])->getSceneObject(0)->getRenderable(); int vbo = renderable->getVertexData()->getBufferID(0); int numVert = renderable->getVertexData()->getNumberOfVertices(); //std::shared_ptr<std::vector<VertexAttrib>> &vertex = renderable->getVertexData()->getDataOf(0); size_t size; void * devPtr; int k = cudaGraphicsGLRegisterBuffer(&cgl, vbo, cudaGraphicsRegisterFlagsReadOnly); k = cudaGraphicsMapResources(1, &cgl, 0); k = cudaGraphicsResourceGetMappedPointer((void **)&devPtr, &size, cgl); CHK_PRIME(rtpBufferDescCreate( m_Context, RTP_BUFFER_FORMAT_VERTEX_FLOAT4, RTP_BUFFER_TYPE_CUDA_LINEAR, devPtr, &m_VerticesDesc) ); CHK_PRIME(rtpBufferDescSetRange(m_VerticesDesc, 0, numVert)); // Create Index Buffer std::shared_ptr<IndexData> &ind = renderable->getIndexData(); std::vector<int> v; ind->getIndexDataAsInt(&v); GLuint index; IBuffer *b; b = RESOURCEMANAGER->createBuffer(m_Name); index = b->getPropi(IBuffer::ID); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index); glBufferData(GL_ELEMENT_ARRAY_BUFFER, v.size() * sizeof(int), &(v)[0], GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); int numInd = (int)v.size(); void * devPtrInd; k = cudaGraphicsGLRegisterBuffer(&cglInd, index, cudaGraphicsRegisterFlagsReadOnly); k = cudaGraphicsMapResources(1, &cglInd, 0); k = cudaGraphicsResourceGetMappedPointer((void **)&devPtrInd, &size, cglInd); CHK_PRIME(rtpBufferDescCreate( m_Context, RTP_BUFFER_FORMAT_INDICES_INT3, RTP_BUFFER_TYPE_CUDA_LINEAR, devPtrInd, &m_IndicesDesc) ); CHK_PRIME(rtpBufferDescSetRange(m_IndicesDesc, 0, numInd/3)); // Create Model CHK_PRIME(rtpModelCreate(m_Context, &m_Model)); CHK_PRIME(rtpModelSetTriangles(m_Model, m_IndicesDesc, m_VerticesDesc)); int useCallerTris = 0; CHK_PRIME(rtpModelSetBuilderParameter(m_Model, RTP_BUILDER_PARAM_USE_CALLER_TRIANGLES, sizeof(int), &useCallerTris)); CHK_PRIME(rtpModelUpdate(m_Model, 0)); CHK_PRIME(rtpModelFinish(m_Model)); cudaGraphicsUnmapResources(1, &cgl, 0); // Create Rays Buffer int rayBufferID = m_Rays->getPropi(IBuffer::ID); int rayBufferRayCount = m_Rays->getPropui(IBuffer::SIZE) / (8 * sizeof(float)); void * devPtrBuff; k = cudaGraphicsGLRegisterBuffer(&cglBuff, rayBufferID, cudaGraphicsRegisterFlagsReadOnly); k = cudaGraphicsMapResources(1, &cglBuff, 0); k = cudaGraphicsResourceGetMappedPointer((void **)&devPtrBuff, &size, cglBuff); CHK_PRIME(rtpBufferDescCreate( m_Context, RTP_BUFFER_FORMAT_RAY_ORIGIN_TMIN_DIRECTION_TMAX, RTP_BUFFER_TYPE_CUDA_LINEAR, devPtrBuff, &m_RaysDesc) ); CHK_PRIME(rtpBufferDescSetRange(m_RaysDesc, 0, rayBufferRayCount)); // Create Hits Buffer int hitBufferID = m_Hits->getPropi(IBuffer::ID); void * devPtrBuffH; k = cudaGraphicsGLRegisterBuffer(&cglBuffH, hitBufferID, cudaGraphicsRegisterFlagsWriteDiscard); k = cudaGraphicsMapResources(1, &cglBuffH, 0); k = cudaGraphicsResourceGetMappedPointer((void **)&devPtrBuffH, &size, cglBuffH); CHK_PRIME(rtpBufferDescCreate( m_Context, RTP_BUFFER_FORMAT_HIT_T_TRIID_U_V, RTP_BUFFER_TYPE_CUDA_LINEAR, devPtrBuffH, &m_HitsDesc) ); CHK_PRIME(rtpBufferDescSetRange(m_HitsDesc, 0, rayBufferRayCount)); // Prepare query CHK_PRIME(rtpQueryCreate(m_Model, m_QueryType, &m_Query)); CHK_PRIME(rtpQuerySetRays(m_Query, m_RaysDesc)); CHK_PRIME(rtpQuerySetHits(m_Query, m_HitsDesc)); m_Init = true; }