]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/opengl/query_backend.cpp
Move all OpenGL-specific code to a separate directory
[libs/gl.git] / source / backends / opengl / query_backend.cpp
diff --git a/source/backends/opengl/query_backend.cpp b/source/backends/opengl/query_backend.cpp
new file mode 100644 (file)
index 0000000..b445be3
--- /dev/null
@@ -0,0 +1,56 @@
+#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