Fix checks for extensions in GL counters. Closes #1442

* GLES doesn't support ARB_occlusion_query2 at all, and ARB_timer_query (or
  equivalent) may not be available for durations.
* Check for ARB_query_buffer_object before pushing or popping query buffer
  binding.
This commit is contained in:
baldurk
2019-07-05 14:02:33 +01:00
parent d03fd1dd25
commit e696c86170
2 changed files with 13 additions and 5 deletions
+4 -1
View File
@@ -687,7 +687,8 @@ extern bool IsGLES;
EXT_TO_CHECK(33, 30, ARB_explicit_attrib_location) \
EXT_TO_CHECK(33, 30, ARB_sampler_objects) \
EXT_TO_CHECK(33, 30, ARB_texture_swizzle) \
EXT_TO_CHECK(33, 30, ARB_occlusion_query2) \
EXT_TO_CHECK(33, 99, ARB_occlusion_query2) \
EXT_TO_CHECK(33, 99, ARB_timer_query) \
EXT_TO_CHECK(40, 32, ARB_draw_buffers_blend) \
EXT_TO_CHECK(40, 31, ARB_draw_indirect) \
EXT_TO_CHECK(40, 32, ARB_gpu_shader5) \
@@ -787,6 +788,8 @@ extern bool IsGLES;
EXT_COMP_CHECK(ARB_texture_storage_multisample, OES_texture_storage_multisample_2d_array) \
EXT_COMP_CHECK(ARB_texture_view, EXT_texture_view) \
EXT_COMP_CHECK(ARB_texture_view, OES_texture_view) \
EXT_COMP_CHECK(ARB_timer_query, EXT_timer_query) \
EXT_COMP_CHECK(ARB_timer_query, EXT_disjoint_timer_query) \
EXT_COMP_CHECK(ARB_viewport_array, NV_viewport_array) \
EXT_COMP_CHECK(ARB_viewport_array, OES_viewport_array) \
EXT_COMP_CHECK(ARB_texture_buffer_object, EXT_texture_buffer) \
+9 -4
View File
@@ -34,7 +34,8 @@ std::vector<GPUCounter> GLReplay::EnumerateCounters()
{
std::vector<GPUCounter> ret;
ret.push_back(GPUCounter::EventGPUDuration);
if(HasExt[ARB_timer_query])
ret.push_back(GPUCounter::EventGPUDuration);
if(HasExt[ARB_occlusion_query2])
ret.push_back(GPUCounter::SamplesPassed);
@@ -523,8 +524,11 @@ std::vector<CounterResult> GLReplay::FetchCounters(const std::vector<GPUCounter>
double nanosToSecs = 1.0 / 1000000000.0;
GLuint prevbind = 0;
m_pDriver->glGetIntegerv(eGL_QUERY_BUFFER_BINDING, (GLint *)&prevbind);
m_pDriver->glBindBuffer(eGL_QUERY_BUFFER, 0);
if(HasExt[ARB_query_buffer_object])
{
m_pDriver->glGetIntegerv(eGL_QUERY_BUFFER_BINDING, (GLint *)&prevbind);
m_pDriver->glBindBuffer(eGL_QUERY_BUFFER, 0);
}
for(size_t i = 0; i < ctx.queries.size(); i++)
{
@@ -556,7 +560,8 @@ std::vector<CounterResult> GLReplay::FetchCounters(const std::vector<GPUCounter>
}
}
m_pDriver->glBindBuffer(eGL_QUERY_BUFFER, prevbind);
if(HasExt[ARB_query_buffer_object])
m_pDriver->glBindBuffer(eGL_QUERY_BUFFER, prevbind);
for(size_t i = 0; i < ctx.queries.size(); i++)
for(uint32_t c = 0; c < counters.size(); c++)