blob: a8b3e9a5803c2d3b19565ea0f9865593951e3f7a [file] [log] [blame]
Jamie Madill9e54b5a2016-05-25 12:57:39 -04001//
Shahbaz Youssefi563fbaa2018-10-02 11:22:01 -04002// Copyright 2016-2018 The ANGLE Project Authors. All rights reserved.
Jamie Madill9e54b5a2016-05-25 12:57:39 -04003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6// QueryVk.cpp:
7// Implements the class methods for QueryVk.
8//
9
10#include "libANGLE/renderer/vulkan/QueryVk.h"
Shahbaz Youssefi563fbaa2018-10-02 11:22:01 -040011#include "libANGLE/Context.h"
12#include "libANGLE/renderer/vulkan/ContextVk.h"
Jamie Madill9e54b5a2016-05-25 12:57:39 -040013
14#include "common/debug.h"
15
16namespace rx
17{
18
Shahbaz Youssefi563fbaa2018-10-02 11:22:01 -040019QueryVk::QueryVk(gl::QueryType type) : QueryImpl(type), mCachedResult(0), mCachedResultValid(false)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040020{
21}
22
Shahbaz Youssefi563fbaa2018-10-02 11:22:01 -040023QueryVk::~QueryVk() = default;
24
25gl::Error QueryVk::onDestroy(const gl::Context *context)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040026{
Shahbaz Youssefi563fbaa2018-10-02 11:22:01 -040027 ContextVk *contextVk = vk::GetImpl(context);
28 contextVk->getQueryPool(getType())->freeQuery(contextVk, &mQueryHelper);
29
30 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -040031}
32
Jamie Madill5188a272018-07-25 10:53:56 -040033gl::Error QueryVk::begin(const gl::Context *context)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040034{
Shahbaz Youssefi563fbaa2018-10-02 11:22:01 -040035 ContextVk *contextVk = vk::GetImpl(context);
36
37 ANGLE_TRY(contextVk->getQueryPool(getType())->allocateQuery(contextVk, &mQueryHelper));
38
39 mCachedResultValid = false;
40
41 mQueryHelper.beginQuery(contextVk, mQueryHelper.getQueryPool(), mQueryHelper.getQuery());
42
43 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -040044}
45
Jamie Madill5188a272018-07-25 10:53:56 -040046gl::Error QueryVk::end(const gl::Context *context)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040047{
Shahbaz Youssefi563fbaa2018-10-02 11:22:01 -040048 ContextVk *contextVk = vk::GetImpl(context);
49
50 mQueryHelper.endQuery(contextVk, mQueryHelper.getQueryPool(), mQueryHelper.getQuery());
51
52 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -040053}
54
Jamie Madill5188a272018-07-25 10:53:56 -040055gl::Error QueryVk::queryCounter(const gl::Context *context)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040056{
57 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -050058 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -040059}
60
Shahbaz Youssefi563fbaa2018-10-02 11:22:01 -040061angle::Result QueryVk::getResult(const gl::Context *context, bool wait)
62{
63 if (mCachedResultValid)
64 {
65 return angle::Result::Continue();
66 }
67
68 ContextVk *contextVk = vk::GetImpl(context);
69
70 VkQueryResultFlags flags = (wait ? VK_QUERY_RESULT_WAIT_BIT : 0) | VK_QUERY_RESULT_64_BIT;
71
72 angle::Result result = mQueryHelper.getQueryPool()->getResults(
73 contextVk, mQueryHelper.getQuery(), 1, sizeof(mCachedResult), &mCachedResult,
74 sizeof(mCachedResult), flags);
75 ANGLE_TRY(result);
76
77 if (result == angle::Result::Continue())
78 {
79 mCachedResultValid = true;
80
81 switch (getType())
82 {
83 case gl::QueryType::AnySamples:
84 case gl::QueryType::AnySamplesConservative:
85 // OpenGL query result in these cases is binary
86 mCachedResult = !!mCachedResult;
87 break;
88 default:
89 UNREACHABLE();
90 break;
91 }
92 }
93
94 return angle::Result::Continue();
95}
96
Jamie Madill5188a272018-07-25 10:53:56 -040097gl::Error QueryVk::getResult(const gl::Context *context, GLint *params)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040098{
Shahbaz Youssefi563fbaa2018-10-02 11:22:01 -040099 ANGLE_TRY(getResult(context, true));
100 *params = static_cast<GLint>(mCachedResult);
101 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400102}
103
Jamie Madill5188a272018-07-25 10:53:56 -0400104gl::Error QueryVk::getResult(const gl::Context *context, GLuint *params)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400105{
Shahbaz Youssefi563fbaa2018-10-02 11:22:01 -0400106 ANGLE_TRY(getResult(context, true));
107 *params = static_cast<GLuint>(mCachedResult);
108 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400109}
110
Jamie Madill5188a272018-07-25 10:53:56 -0400111gl::Error QueryVk::getResult(const gl::Context *context, GLint64 *params)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400112{
Shahbaz Youssefi563fbaa2018-10-02 11:22:01 -0400113 ANGLE_TRY(getResult(context, true));
114 *params = static_cast<GLint64>(mCachedResult);
115 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400116}
117
Jamie Madill5188a272018-07-25 10:53:56 -0400118gl::Error QueryVk::getResult(const gl::Context *context, GLuint64 *params)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400119{
Shahbaz Youssefi563fbaa2018-10-02 11:22:01 -0400120 ANGLE_TRY(getResult(context, true));
121 *params = mCachedResult;
122 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400123}
124
Jamie Madill5188a272018-07-25 10:53:56 -0400125gl::Error QueryVk::isResultAvailable(const gl::Context *context, bool *available)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400126{
Shahbaz Youssefi563fbaa2018-10-02 11:22:01 -0400127 ContextVk *contextVk = vk::GetImpl(context);
128
129 // Make sure the command buffer for this query is submitted. If not, *available should always
130 // be false. This is because the reset command is not yet executed (it's only put in the command
131 // graph), so actually checking the results may return "true" because of a previous submission.
132
133 if (mQueryHelper.hasPendingWork(contextVk->getRenderer()))
134 {
135 *available = false;
136 return gl::NoError();
137 }
138
139 ANGLE_TRY(getResult(context, false));
140 *available = mCachedResultValid;
141
142 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400143}
144
145} // namespace rx