]> git.tdb.fi Git - libs/gl.git/blob - source/core/query.cpp
Add an abstraction for queries
[libs/gl.git] / source / core / query.cpp
1 #include <stdexcept>
2 #include <msp/gl/extensions/arb_occlusion_query.h>
3 #include <msp/gl/extensions/arb_occlusion_query2.h>
4 #include "query.h"
5 #include "renderer.h"
6
7 using namespace std;
8
9 namespace Msp {
10 namespace GL {
11
12 QueryPool::QueryPool(QueryType t, unsigned s):
13         type(t),
14         gl_type(get_gl_query_type(type))
15 {
16         if(type==OCCLUSION_QUERY)
17         {
18                 static Require req(ARB_occlusion_query);
19                 static Require req2(ARB_occlusion_query2);
20         }
21
22         resize(s);
23 }
24
25 QueryPool::~QueryPool()
26 {
27         glDeleteQueries(queries.size(), queries.data());
28 }
29
30 void QueryPool::resize(unsigned s)
31 {
32         if(s<queries.size())
33                 glDeleteQueries(queries.size()-s, queries.data()+s);
34
35         unsigned old_size = queries.size();
36         queries.resize(s);
37         if(s>old_size)
38                 glGenQueries(s-old_size, queries.data()+old_size);
39 }
40
41 unsigned QueryPool::get_result(unsigned i) const
42 {
43         unsigned result = 0;
44         glGetQueryObjectuiv(queries[i], GL_QUERY_RESULT, &result);
45         return result;
46 }
47
48
49 QueryPool::Activate::Activate(Renderer &r, const QueryPool &p, unsigned i):
50         renderer(r),
51         pool(p),
52         index(i)
53 {
54         renderer.begin_query(pool, index);
55 }
56
57 QueryPool::Activate::~Activate()
58 {
59         renderer.end_query(pool, index);
60 }
61
62
63 unsigned get_gl_query_type(QueryType t)
64 {
65         switch(t)
66         {
67         case OCCLUSION_QUERY: return GL_ANY_SAMPLES_PASSED;
68         default: throw invalid_argument("get_gl_query_type");
69         }
70 }
71
72 } // namespace GL
73 } // namespace Msp