1//************************************ bs::framework - Copyright 2018 Marko Pintera **************************************//
2//*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********//
3#include "BsGLEventQuery.h"
4#include "BsGLCommandBuffer.h"
5#include "Profiling/BsRenderStats.h"
6
7namespace bs { namespace ct
8{
9 GLEventQuery::GLEventQuery(UINT32 deviceIdx)
10 {
11 assert(deviceIdx == 0 && "Multiple GPUs not supported natively on OpenGL.");
12
13 glGenQueries(1, &mQueryObj);
14 BS_CHECK_GL_ERROR();
15
16 BS_INC_RENDER_STAT_CAT(ResCreated, RenderStatObject_Query);
17 }
18
19 GLEventQuery::~GLEventQuery()
20 {
21 glDeleteQueries(1, &mQueryObj);
22 BS_CHECK_GL_ERROR();
23
24 BS_INC_RENDER_STAT_CAT(ResDestroyed, RenderStatObject_Query);
25 }
26
27 void GLEventQuery::begin(const SPtr<CommandBuffer>& cb)
28 {
29 auto execute = [&]()
30 {
31 glQueryCounter(mQueryObj, GL_TIMESTAMP);
32 BS_CHECK_GL_ERROR();
33
34 setActive(true);
35 };
36
37 if (cb == nullptr)
38 execute();
39 else
40 {
41 SPtr<GLCommandBuffer> glCB = std::static_pointer_cast<GLCommandBuffer>(cb);
42 glCB->queueCommand(execute);
43 }
44 }
45
46 bool GLEventQuery::isReady() const
47 {
48 GLint done = 0;
49 glGetQueryObjectiv(mQueryObj, GL_QUERY_RESULT_AVAILABLE, &done);
50 BS_CHECK_GL_ERROR();
51
52 return done == GL_TRUE;
53 }
54}}