22 if(m_mesh.vertex_count() == 0)
25 m_program=
read_program(
"gkit2_tutos/M2/statistics.glsl");
31 m_mesh.bounds(pmin, pmax);
32 m_camera.lookat(pmin, pmax);
35 glGenQueries(1, &m_sample_query);
36 glGenQueries(1, &m_vertex_query);
37 glGenQueries(1, &m_primitive_query);
38 glGenQueries(1, &m_vertex_shader_query);
39 glGenQueries(1, &m_culling_query);
40 glGenQueries(1, &m_clipping_query);
41 glGenQueries(1, &m_sample_query);
42 glGenQueries(1, &m_fragment_shader_query);
45 glClearColor(0.2f, 0.2f, 0.2f, 1.f);
48 glDepthFunc(GL_LEQUAL);
49 glEnable(GL_DEPTH_TEST);
50 glEnable(GL_CULL_FACE);
62 update_camera( m_camera );
64 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
67 static bool rasterizer_discard=
false;
71 rasterizer_discard= !rasterizer_discard;
74 if(!rasterizer_discard)
77 printf(
"rasterizer off\n");
79 if(rasterizer_discard)
80 glEnable(GL_RASTERIZER_DISCARD);
82 glDisable(GL_RASTERIZER_DISCARD);
84 static bool zinit=
false;
98 static bool cull=
true;
106 glEnable(GL_CULL_FACE);
108 glDisable(GL_CULL_FACE);
111 printf(
"face culling ON\n");
113 printf(
"face culling off\n");
116 static bool early_tests=
false;
117 static const char *early_tests_definition=
"";
121 early_tests= !early_tests;
125 early_tests_definition=
"#define EARLY_TESTS";
127 early_tests_definition=
"#undef EARLY_TESTS";
130 printf(
"early fragment tests ON\n");
132 printf(
"early fragment test off\n");
134 reload_program(m_program, early_tests_definition);
147 draw( m_mesh,
Identity(), m_camera );
150 glBeginQuery(GL_VERTICES_SUBMITTED, m_vertex_query);
151 glBeginQuery(GL_PRIMITIVES_SUBMITTED, m_primitive_query);
152 glBeginQuery(GL_VERTEX_SHADER_INVOCATIONS, m_vertex_shader_query);
153 glBeginQuery(GL_CLIPPING_INPUT_PRIMITIVES, m_culling_query);
154 glBeginQuery(GL_CLIPPING_OUTPUT_PRIMITIVES, m_clipping_query);
155 glBeginQuery(GL_SAMPLES_PASSED, m_sample_query);
156 glBeginQuery(GL_FRAGMENT_SHADER_INVOCATIONS, m_fragment_shader_query);
158 glUseProgram(m_program);
159 program_uniform(m_program,
"mvMatrix", mv);
160 program_uniform(m_program,
"mvpMatrix", mvp);
162 m_mesh.draw(m_program);
165 glEndQuery(GL_VERTICES_SUBMITTED);
166 glEndQuery(GL_PRIMITIVES_SUBMITTED);
167 glEndQuery(GL_VERTEX_SHADER_INVOCATIONS);
168 glEndQuery(GL_CLIPPING_INPUT_PRIMITIVES);
169 glEndQuery(GL_CLIPPING_OUTPUT_PRIMITIVES);
170 glEndQuery(GL_SAMPLES_PASSED);
171 glEndQuery(GL_FRAGMENT_SHADER_INVOCATIONS);
174 GLint64 gpu_vertex= 0;
175 glGetQueryObjecti64v(m_vertex_query, GL_QUERY_RESULT, &gpu_vertex);
176 GLint64 gpu_primitive= 0;
177 glGetQueryObjecti64v(m_primitive_query, GL_QUERY_RESULT, &gpu_primitive);
178 GLint64 gpu_vertex_shader= 0;
179 glGetQueryObjecti64v(m_vertex_shader_query, GL_QUERY_RESULT, &gpu_vertex_shader);
180 GLint64 gpu_culling= 0;
181 glGetQueryObjecti64v(m_culling_query, GL_QUERY_RESULT, &gpu_culling);
182 GLint64 gpu_clipping= 0;
183 glGetQueryObjecti64v(m_clipping_query, GL_QUERY_RESULT, &gpu_clipping);
184 GLint64 gpu_samples= 0;
185 glGetQueryObjecti64v(m_sample_query, GL_QUERY_RESULT, &gpu_samples);
186 GLint64 gpu_fragment_shader= 0;
187 glGetQueryObjecti64v(m_fragment_shader_query, GL_QUERY_RESULT, &gpu_fragment_shader);
194 if(zinit)
printf(
"Z prepass ON, ");
195 else printf(
"Z prepass off, ");
196 if(cull)
printf(
"face culling ON, ");
197 else printf(
"face culling off, ");
198 if(early_tests)
printf(
"early fragment tests ON");
199 else printf(
"early fragment test off");
202 printf(
"primitives %d\n",
int(gpu_primitive));
203 printf(
"positions %d, indices %d, vertex shader %d\n", m_mesh.vertex_count(),
int(gpu_vertex),
int(gpu_vertex_shader));
204 printf(
"culling primitives %d, clipping primitives %d\n",
int(gpu_culling),
int(gpu_clipping));
205 printf(
"samples %d, fragment shaders %d\n",
int(gpu_samples),
int(gpu_fragment_shader));
209 glDisable(GL_RASTERIZER_DISCARD);
AppTime(const int width, const int height, const int major=3, const int minor=3)
constructeur, dimensions de la fenetre et version d'openGL.
void printf(Text &text, const int px, const int py, const char *format,...)
affiche un texte a la position x, y. meme utilisation que printf().