+void create_geometry_correction(CompositedMonitor *monitor)
+{
+ unsigned buffers[2];
+ unsigned stride;
+
+ glGenBuffers(2, buffers);
+ monitor->vertex_buffer = buffers[0];
+ monitor->index_buffer = buffers[1];
+
+ monitor->tessellation = 50;
+ monitor->geometry_data_size = (monitor->tessellation+1)*(monitor->tessellation+1)*3+16;
+ monitor->geometry_data = (short *)malloc(monitor->geometry_data_size*sizeof(short));
+ stride = 4*sizeof(float);
+
+ glGenVertexArrays(1, &monitor->vertex_array);
+ glBindVertexArray(monitor->vertex_array);
+ glBindBuffer(GL_ARRAY_BUFFER, monitor->vertex_buffer);
+ glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, stride, NULL);
+ glEnableVertexAttribArray(0);
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, stride, (void *)(2*sizeof(float)));
+ glEnableVertexAttribArray(1);
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, monitor->index_buffer);
+ glBindVertexArray(0);
+}
+
+void free_geometry_correction(CompositedMonitor *monitor)
+{
+ unsigned buffers[2];
+
+ buffers[0] = monitor->vertex_buffer;
+ buffers[1] = monitor->index_buffer;
+ glDeleteBuffers(2, buffers);
+ monitor->vertex_buffer = 0;
+ monitor->index_buffer = 0;
+
+ glDeleteVertexArrays(1, &monitor->vertex_array);
+
+ free(monitor->geometry_data);
+ monitor->geometry_data = 0;
+}
+