--- /dev/null
+#include <stdexcept>
+#include <msp/gl/extensions/arb_occlusion_query.h>
+#include <msp/gl/extensions/arb_occlusion_query2.h>
+#include "query.h"
+#include "query_backend.h"
+
+using namespace std;
+
+namespace Msp {
+namespace GL {
+
+OpenGLQueryPool::OpenGLQueryPool(unsigned t):
+ gl_type(get_gl_query_type(t))
+{
+ if(t==OCCLUSION_QUERY)
+ {
+ static Require req(ARB_occlusion_query);
+ static Require req2(ARB_occlusion_query2);
+ }
+}
+
+OpenGLQueryPool::~OpenGLQueryPool()
+{
+ glDeleteQueries(queries.size(), queries.data());
+}
+
+void OpenGLQueryPool::resize(unsigned s)
+{
+ if(s<queries.size())
+ glDeleteQueries(queries.size()-s, queries.data()+s);
+
+ unsigned old_size = queries.size();
+ queries.resize(s);
+ if(s>old_size)
+ glGenQueries(s-old_size, queries.data()+old_size);
+}
+
+unsigned OpenGLQueryPool::get_result(unsigned i) const
+{
+ unsigned result = 0;
+ glGetQueryObjectuiv(queries[i], GL_QUERY_RESULT, &result);
+ return result;
+}
+
+
+unsigned get_gl_query_type(unsigned t)
+{
+ switch(t)
+ {
+ case OCCLUSION_QUERY: return GL_ANY_SAMPLES_PASSED;
+ default: throw invalid_argument("get_gl_query_type");
+ }
+}
+
+} // namespace GL
+} // namespace Msp