Refactoring of streamer code to integrate texture and vbo memory management in progress.

This commit is contained in:
2014-05-25 23:11:15 -07:00
parent e596760d47
commit bfefcdd055
3 changed files with 31 additions and 10 deletions

View File

@@ -333,7 +333,7 @@ void KRMesh::renderSubmesh(int iSubmesh, KRNode::RenderPass renderPass, const st
if(m_submeshes[iSubmesh]->vertex_data_blocks.size() <= vbo_index) { if(m_submeshes[iSubmesh]->vertex_data_blocks.size() <= vbo_index) {
KRDataBlock *vertex_data_block = m_pData->getSubBlock(vertex_data_offset + start_vertex_offset * m_vertex_size, vertex_count * m_vertex_size); KRDataBlock *vertex_data_block = m_pData->getSubBlock(vertex_data_offset + start_vertex_offset * m_vertex_size, vertex_count * m_vertex_size);
KRDataBlock *index_data_block = m_pData->getSubBlock(index_data_offset + start_index_offset * 2, index_count * 2); KRDataBlock *index_data_block = m_pData->getSubBlock(index_data_offset + start_index_offset * 2, index_count * 2);
vbo_data_block = new KRMeshManager::KRVBOData(*vertex_data_block, *index_data_block, vertex_attrib_flags, true, false); vbo_data_block = new KRMeshManager::KRVBOData(getContext().getMeshManager(), *vertex_data_block, *index_data_block, vertex_attrib_flags, true, false);
m_submeshes[iSubmesh]->vertex_data_blocks.push_back(vertex_data_block); m_submeshes[iSubmesh]->vertex_data_blocks.push_back(vertex_data_block);
m_submeshes[iSubmesh]->index_data_blocks.push_back(index_data_block); m_submeshes[iSubmesh]->index_data_blocks.push_back(index_data_block);
m_submeshes[iSubmesh]->vbo_data_blocks.push_back(vbo_data_block); m_submeshes[iSubmesh]->vbo_data_blocks.push_back(vbo_data_block);
@@ -368,7 +368,7 @@ void KRMesh::renderSubmesh(int iSubmesh, KRNode::RenderPass renderPass, const st
if(m_submeshes[iSubmesh]->vertex_data_blocks.size() <= vbo_index) { if(m_submeshes[iSubmesh]->vertex_data_blocks.size() <= vbo_index) {
KRDataBlock *index_data_block = NULL; KRDataBlock *index_data_block = NULL;
KRDataBlock *vertex_data_block = m_pData->getSubBlock(vertex_data_offset + iBuffer * MAX_VBO_SIZE * vertex_size, vertex_size * cBufferVertexes); KRDataBlock *vertex_data_block = m_pData->getSubBlock(vertex_data_offset + iBuffer * MAX_VBO_SIZE * vertex_size, vertex_size * cBufferVertexes);
vbo_data_block = new KRMeshManager::KRVBOData(*vertex_data_block, *index_data_block, vertex_attrib_flags, true, false); vbo_data_block = new KRMeshManager::KRVBOData(getContext().getMeshManager(), *vertex_data_block, *index_data_block, vertex_attrib_flags, true, false);
m_submeshes[iSubmesh]->vertex_data_blocks.push_back(vertex_data_block); m_submeshes[iSubmesh]->vertex_data_blocks.push_back(vertex_data_block);
m_submeshes[iSubmesh]->vbo_data_blocks.push_back(vbo_data_block); m_submeshes[iSubmesh]->vbo_data_blocks.push_back(vbo_data_block);
} else { } else {

View File

@@ -76,7 +76,7 @@ KRMeshManager::KRMeshManager(KRContext &context) : KRContextObject(context) {
memcpy(KRENGINE_VBO_3D_CUBE_VERTICES.getStart(), _KRENGINE_VBO_3D_CUBE_VERTEX_DATA, sizeof(GLfloat) * 3 * 14); memcpy(KRENGINE_VBO_3D_CUBE_VERTICES.getStart(), _KRENGINE_VBO_3D_CUBE_VERTEX_DATA, sizeof(GLfloat) * 3 * 14);
KRENGINE_VBO_3D_CUBE_VERTICES.unlock(); KRENGINE_VBO_3D_CUBE_VERTICES.unlock();
KRENGINE_VBO_DATA_3D_CUBE_VERTICES.init(KRENGINE_VBO_3D_CUBE_VERTICES, KRENGINE_VBO_3D_CUBE_INDEXES, KRENGINE_VBO_3D_CUBE_ATTRIBS, false, false); KRENGINE_VBO_DATA_3D_CUBE_VERTICES.init(this, KRENGINE_VBO_3D_CUBE_VERTICES, KRENGINE_VBO_3D_CUBE_INDEXES, KRENGINE_VBO_3D_CUBE_ATTRIBS, false, false);
@@ -92,7 +92,7 @@ KRMeshManager::KRMeshManager(KRContext &context) : KRContextObject(context) {
memcpy(KRENGINE_VBO_2D_SQUARE_VERTICES.getStart(), _KRENGINE_VBO_2D_SQUARE_VERTEX_DATA, sizeof(GLfloat) * 5 * 4); memcpy(KRENGINE_VBO_2D_SQUARE_VERTICES.getStart(), _KRENGINE_VBO_2D_SQUARE_VERTEX_DATA, sizeof(GLfloat) * 5 * 4);
KRENGINE_VBO_2D_SQUARE_VERTICES.unlock(); KRENGINE_VBO_2D_SQUARE_VERTICES.unlock();
KRENGINE_VBO_DATA_2D_SQUARE_VERTICES.init(KRENGINE_VBO_2D_SQUARE_VERTICES, KRENGINE_VBO_2D_SQUARE_INDEXES, KRENGINE_VBO_2D_SQUARE_ATTRIBS, false, false); KRENGINE_VBO_DATA_2D_SQUARE_VERTICES.init(this, KRENGINE_VBO_2D_SQUARE_VERTICES, KRENGINE_VBO_2D_SQUARE_INDEXES, KRENGINE_VBO_2D_SQUARE_ATTRIBS, false, false);
} }
@@ -247,7 +247,7 @@ void KRMeshManager::bindVBO(KRVBOData *vbo_data)
void KRMeshManager::bindVBO(KRDataBlock &data, KRDataBlock &index_data, int vertex_attrib_flags, bool static_vbo) void KRMeshManager::bindVBO(KRDataBlock &data, KRDataBlock &index_data, int vertex_attrib_flags, bool static_vbo)
{ {
KRVBOData *vbo_data = new KRVBOData(data, index_data, vertex_attrib_flags, static_vbo, true); KRVBOData *vbo_data = new KRVBOData(this, data, index_data, vertex_attrib_flags, static_vbo, true);
bindVBO(vbo_data); bindVBO(vbo_data);
} }
@@ -487,6 +487,7 @@ void KRMeshManager::doStreaming(long &memoryRemaining, long &memoryRemainingThis
KRMeshManager::KRVBOData::KRVBOData() KRMeshManager::KRVBOData::KRVBOData()
{ {
m_manager = NULL;
m_temp_vbo = false; m_temp_vbo = false;
m_static_vbo = false; m_static_vbo = false;
m_data = NULL; m_data = NULL;
@@ -496,15 +497,19 @@ KRMeshManager::KRVBOData::KRVBOData()
m_vbo_handle_indexes = -1; m_vbo_handle_indexes = -1;
m_vao_handle = -1; m_vao_handle = -1;
m_size = 0; m_size = 0;
m_last_frame_used = 0;
m_last_frame_max_lod_coverage = 0.0f;
} }
KRMeshManager::KRVBOData::KRVBOData(KRDataBlock &data, KRDataBlock &index_data, int vertex_attrib_flags, bool static_vbo, bool temp_vbo) KRMeshManager::KRVBOData::KRVBOData(KRMeshManager *manager, KRDataBlock &data, KRDataBlock &index_data, int vertex_attrib_flags, bool static_vbo, bool temp_vbo)
{ {
init(data,index_data,vertex_attrib_flags, static_vbo, temp_vbo); init(manager, data,index_data,vertex_attrib_flags, static_vbo, temp_vbo);
} }
void KRMeshManager::KRVBOData::init(KRDataBlock &data, KRDataBlock &index_data, int vertex_attrib_flags, bool static_vbo, bool temp_vbo) void KRMeshManager::KRVBOData::init(KRMeshManager *manager, KRDataBlock &data, KRDataBlock &index_data, int vertex_attrib_flags, bool static_vbo, bool temp_vbo)
{ {
m_manager = manager;
m_temp_vbo = temp_vbo; m_temp_vbo = temp_vbo;
m_static_vbo = static_vbo; m_static_vbo = static_vbo;
m_data = &data; m_data = &data;
@@ -615,4 +620,14 @@ void KRMeshManager::KRVBOData::bind()
GLDEBUG(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_vbo_handle_indexes)); GLDEBUG(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_vbo_handle_indexes));
} }
#endif #endif
}
void KRMeshManager::KRVBOData::resetPoolExpiry(float lodCoverage)
{
long current_frame = m_manager->getContext().getCurrentFrame();
if(current_frame != m_last_frame_used) {
m_last_frame_used = current_frame;
m_last_frame_max_lod_coverage = 0.0f;
}
m_last_frame_max_lod_coverage = KRMAX(lodCoverage, m_last_frame_max_lod_coverage);
} }

View File

@@ -64,8 +64,8 @@ public:
public: public:
KRVBOData(); KRVBOData();
KRVBOData(KRDataBlock &data, KRDataBlock &index_data, int vertex_attrib_flags, bool static_vbo, bool temp_vbo); KRVBOData(KRMeshManager *manager, KRDataBlock &data, KRDataBlock &index_data, int vertex_attrib_flags, bool static_vbo, bool temp_vbo);
void init(KRDataBlock &data, KRDataBlock &index_data, int vertex_attrib_flags, bool static_vbo, bool temp_vbo); void init(KRMeshManager *manager, KRDataBlock &data, KRDataBlock &index_data, int vertex_attrib_flags, bool static_vbo, bool temp_vbo);
~KRVBOData(); ~KRVBOData();
@@ -84,7 +84,10 @@ public:
bool isTemporary() { return m_temp_vbo; } bool isTemporary() { return m_temp_vbo; }
bool getSize() { return m_size; } bool getSize() { return m_size; }
void resetPoolExpiry(float lodCoverage);
private: private:
KRMeshManager *m_manager;
int m_vertex_attrib_flags; int m_vertex_attrib_flags;
GLuint m_vbo_handle; GLuint m_vbo_handle;
GLuint m_vbo_handle_indexes; GLuint m_vbo_handle_indexes;
@@ -92,6 +95,9 @@ public:
bool m_static_vbo; bool m_static_vbo;
bool m_temp_vbo; bool m_temp_vbo;
GLsizeiptr m_size; GLsizeiptr m_size;
long m_last_frame_used;
float m_last_frame_max_lod_coverage;
}; };
void bindVBO(KRVBOData *vbo_data); void bindVBO(KRVBOData *vbo_data);