Commit 03f03769 by Kai Westerkamp

time trace

parent fc9a48c7
......@@ -4,3 +4,4 @@ Q_LOGGING_CATEGORY(log_subdiv, "subdiv")
Q_LOGGING_CATEGORY(log_subdiv_trace, "subdiv.trace")
Q_LOGGING_CATEGORY(log_mesh, "mesh")
Q_LOGGING_CATEGORY(log_mesh_render, "mesh.render")
Q_LOGGING_CATEGORY(log_timing, "timing")
......@@ -8,5 +8,6 @@ Q_DECLARE_LOGGING_CATEGORY(log_subdiv)
Q_DECLARE_LOGGING_CATEGORY(log_subdiv_trace)
Q_DECLARE_LOGGING_CATEGORY(log_mesh)
Q_DECLARE_LOGGING_CATEGORY(log_mesh_render)
Q_DECLARE_LOGGING_CATEGORY(log_timing)
#endif
......@@ -5,7 +5,8 @@
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QLoggingCategory::setFilterRules("mesh.debug=false\n"
QLoggingCategory::setFilterRules("timing.debug=true\n"
"mesh.debug=false\n"
"mesh.render.debug=false\n"
"subdiv.debug=true\n"
"subdiv.trace.debug=false\n");
......
......@@ -139,16 +139,18 @@ void MainWidget::loadNewMesh(){
tr("*.md5mesh *.3ds *.md2 *.obj *.dae *.dxf *.mesh.xml *.blend *.b3d" ));
loadNewMesh(fn);
}
void MainWidget::loadNewMesh(QString path){
QDir dir(".");
qDebug()<<dir.absolutePath();
//qDebug()<<dir.absolutePath();
if(path.isEmpty())
return;
qDebug()<<"Opening File:"<<path;
mesh = new Mesh(this,path);
qDebug()<<"Mesh loading finished";
subdivision->splitRegular(mesh);
}
......
......@@ -42,7 +42,7 @@ MainWindow::MainWindow(QWidget *parent) :
subdivSlider = new QSlider(Qt::Horizontal);
subdivSlider->setMinimum(0);
subdivSlider->setMaximum(5);
subdivSlider->setMaximum(6);
subdivSlider->setSliderPosition(0);
subdivSlider->setSingleStep(1);
......
......@@ -57,7 +57,7 @@ void Subdivision::subdivide(Mesh *mesh, int level) {
Input input;
int currentMax = current_mesh->buffers.size()-1;
qCDebug(log_subdiv) << "Subdiv Level" << level << "Requested. Current Max:" << currentMax;
//qCDebug(log_subdiv) << "Subdiv Level" << level << "Requested. Current Max:" << currentMax;
if(level <= currentMax)
return;
......@@ -351,13 +351,16 @@ void Subdivision::precomputeVertexTable(Subdivision::Tables &tables, QVector<Ver
tables.vertex_offsets.push_back(offset);
qCDebug(log_subdiv) << "Done with vertex index table. ";
qCDebug(log_subdiv) << "Duplicates: ";
qCDebug(log_subdiv) << "Duplicates: "<<duplicates.length();
for (int i = 0; i < duplicates.length(); i++){
qCDebug(log_subdiv) << duplicates[i];
qCDebug(log_subdiv_trace) << duplicates[i];
}
}
void Subdivision::splitRegular(Mesh *mesh) {
QTime totalTimer;
totalTimer.start();
qCDebug(log_timing) << "splitRegular(mesh) started";
Mesh::Node root = mesh->getRootNode();
int first_mesh_index = -1;
......@@ -370,6 +373,7 @@ void Subdivision::splitRegular(Mesh *mesh) {
QVector<unsigned int> regular;
QVector<unsigned int> irregular;
findRegular(current_mesh->buffers[0]->indices_irregular, current_mesh->buffers[0]->vertices, regular, irregular);
findRegular(current_mesh->buffers[0]->indices_regular, current_mesh->buffers[0]->vertices, regular, irregular);
......@@ -378,6 +382,8 @@ void Subdivision::splitRegular(Mesh *mesh) {
current_mesh->buffers[0]->indices_irregular = irregular;
current_mesh->buffers[0]->updateIndices();
qCDebug(log_timing) << "splitRegular(mesh): time: " << totalTimer.elapsed()<<"ms";
qCDebug(log_subdiv) << "splitRegular(mesh): regular: " << regular.length();
qCDebug(log_subdiv) << "splitRegular(mesh): irregular: " << irregular.length();
}
......@@ -404,6 +410,9 @@ void Subdivision::splitRegular(Mesh *mesh) {
* @return patch index buffer with 4 times as many indices. ! if something goes wrong, the current buffer is returned and might be incomplete or empty.
*/
QVector<unsigned int> Subdivision::getPatchIndexBuffer(QVector<unsigned int> ib_regular, QVector<unsigned int> ib_irregular, QVector<Vertex> vb){
QTime totalTimer;
totalTimer.start();
qCDebug(log_timing)<<"PatchIndexBuffer started";
QVector<unsigned int> pib;
QVector<unsigned int> ib_combined = ib_regular + ib_irregular;
for (int i = 0; i < ib_regular.length() - 2; i+=3){
......@@ -422,7 +431,7 @@ QVector<unsigned int> Subdivision::getPatchIndexBuffer(QVector<unsigned int> ib_
int count3 = 0; //counts other triangles with this vertex
int count6 = 0;
int count7 = 0;
/*
for (int j = 0; j < ib_combined.length(); j++){
if (j != i && j != i+1 && j != i+2){
//for debugging // checking if patch is regular.
......@@ -434,7 +443,7 @@ QVector<unsigned int> Subdivision::getPatchIndexBuffer(QVector<unsigned int> ib_
if (count3 != 5 || count6 != 5 || count7 != 5){
qCWarning(log_subdiv) << "Counts wrong! 3: "<< count3 <<", 6: " << count6 << ", 7: " << count7 << ".\nEither this patch is not regular, or you didn't pass all neighboring triangles.";
}
*/
//find triangles with shared edge. Fills i2, i4, i10.
{
......@@ -525,6 +534,7 @@ QVector<unsigned int> Subdivision::getPatchIndexBuffer(QVector<unsigned int> ib_
}
}
qCDebug(log_timing)<<"PatchIndexBuffer done:"<<totalTimer.elapsed()<<"ms";
return pib;
}
......@@ -550,6 +560,9 @@ QVector<unsigned int> Subdivision::getTriangles(QVector<unsigned int> ib) {
* @param irregular All irregular triangles are appended to this index buffer.
*/
void Subdivision::findRegular(QVector<unsigned int> index_buffer, QVector<Vertex> vertex_buffer, QVector<unsigned int> &regular, QVector<unsigned int> &irregular) {
QTime totalTimer;
totalTimer.start();
qCDebug(log_timing)<<"Find Regular started";
for (int i = 0; i < index_buffer.length()-2; i += 3){
Vertex vx = vertex_buffer[index_buffer[i]];
Vertex vy = vertex_buffer[index_buffer[i+1]];
......@@ -581,6 +594,7 @@ void Subdivision::findRegular(QVector<unsigned int> index_buffer, QVector<Vertex
irregular.push_back(index_buffer[i+2]);
}
}
qCDebug(log_timing)<<"Find Regular done:"<<totalTimer.elapsed()<<"ms";
}
bool Subdivision::matchAndCompleteTriangleIndices(unsigned int sx, unsigned int sy, unsigned int sz, unsigned int tx, unsigned int ty, unsigned int &tz){
......@@ -649,10 +663,15 @@ Subdivision::Result Subdivision::runShader(Input input, Tables &tables) {
result.vb_handle = output_handle;
f->glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
QTime timer;
timer.start();
runVertexShader(input.vertex_buffer.size(), input.vb_handle, vertex_indices_handle, vertex_offsets_handle, output_handle);
int vertexTime = timer.elapsed();
timer.restart();
int edgeOffset = input.vertex_buffer.size();
runEdgeShader(tables.edge_indices.size() / 4, input.vb_handle, edge_indices_handle, output_handle, edgeOffset);
int edgeTime = timer.elapsed();
timer.restart();
// Map the output buffer so we can read the results
f->glBindBuffer(GL_SHADER_STORAGE_BUFFER, output_handle);
......@@ -669,7 +688,7 @@ Subdivision::Result Subdivision::runShader(Input input, Tables &tables) {
qCDebug(log_subdiv_trace) << ptr[edgeOffset + i].pos;
result.vertex_buffer.push_back(ptr[edgeOffset + i]);
}
int bufferbildTime = timer.elapsed();
f->glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
......@@ -678,6 +697,7 @@ Subdivision::Result Subdivision::runShader(Input input, Tables &tables) {
f->glDeleteBuffers(1, &vertex_offsets_handle);
f->glDeleteBuffers(1, &edge_indices_handle);
qCDebug(log_timing)<<"Compute Shader done. Vertexshader"<<vertexTime<<"ms; EdgeShader"<<edgeTime<<" BufferToCPU"<<bufferbildTime<<"ms";
return result;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment