summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineOpenGL
diff options
context:
space:
mode:
authorazhirnov <zh1dron@gmail.com>2020-08-31 12:04:27 +0000
committerazhirnov <zh1dron@gmail.com>2020-08-31 12:09:36 +0000
commitab1149384b1185eb1b22eab8344055f82f9e10cb (patch)
tree8221754353a7250d0a0b3ef84d229200c623f67b /Graphics/GraphicsEngineOpenGL
parentremoved unused DXILUtils, fixed some Codacy issues (diff)
parentAdded C API for IReferenceCounters (diff)
downloadDiligentCore-ab1149384b1185eb1b22eab8344055f82f9e10cb.tar.gz
DiligentCore-ab1149384b1185eb1b22eab8344055f82f9e10cb.zip
Merge branch 'master' into mesh_shader
# Conflicts: # Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp
Diffstat (limited to 'Graphics/GraphicsEngineOpenGL')
-rw-r--r--Graphics/GraphicsEngineOpenGL/include/GLStubsAndroid.h20
-rw-r--r--Graphics/GraphicsEngineOpenGL/include/GLStubsIOS.h1
-rw-r--r--Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp31
-rw-r--r--Graphics/GraphicsEngineOpenGL/src/GLStubsAndroid.cpp87
-rw-r--r--Graphics/GraphicsEngineOpenGL/src/QueryGLImpl.cpp34
-rw-r--r--Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp35
6 files changed, 145 insertions, 63 deletions
diff --git a/Graphics/GraphicsEngineOpenGL/include/GLStubsAndroid.h b/Graphics/GraphicsEngineOpenGL/include/GLStubsAndroid.h
index faa28354..41abe30a 100644
--- a/Graphics/GraphicsEngineOpenGL/include/GLStubsAndroid.h
+++ b/Graphics/GraphicsEngineOpenGL/include/GLStubsAndroid.h
@@ -1013,6 +1013,16 @@ extern PFNGLMEMORYBARRIERPROC glMemoryBarrier;
#endif
+/* ------------------------------ GL_EXT_disjoint_timer_query ----------------------------- */
+#ifndef GL_TIMESTAMP
+# define GL_TIMESTAMP 0x8E28
+#endif
+
+#ifndef GL_TIME_ELAPSED
+# define GL_TIME_ELAPSED 0x88BF
+#endif
+
+
// Define unsupported GL function stubs
template<typename T>
@@ -1177,6 +1187,16 @@ extern PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC glDrawArraysInstancedBaseInstanc
typedef void (GL_APIENTRY* PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
extern PFNGLDRAWELEMENTSBASEVERTEXPROC glDrawElementsBaseVertex;
+
+#define LOAD_GL_GET_QUERY_OBJECT_UI64V
+typedef void (GL_APIENTRY* PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64* params);
+extern PFNGLGETQUERYOBJECTUI64VPROC glGetQueryObjectui64v;
+
+#define LOAD_GL_QUERY_COUNTER
+typedef void (GL_APIENTRY* PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target);
+extern PFNGLQUERYCOUNTERPROC glQueryCounter;
+
+
#ifndef GL_ES_VERSION_3_2
typedef void (GL_APIENTRY* GLDEBUGPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam);
diff --git a/Graphics/GraphicsEngineOpenGL/include/GLStubsIOS.h b/Graphics/GraphicsEngineOpenGL/include/GLStubsIOS.h
index bebbc669..4e5ec188 100644
--- a/Graphics/GraphicsEngineOpenGL/include/GLStubsIOS.h
+++ b/Graphics/GraphicsEngineOpenGL/include/GLStubsIOS.h
@@ -544,3 +544,4 @@ static void (*glPolygonMode)(GLenum face, GLenum mode) = nullptr;
#define glColorMaski(...) UnsupportedGLFunctionStub("glColorMaski")
#define glFramebufferTexture(...) UnsupportedGLFunctionStub("glFramebufferTexture")
#define glFramebufferTexture1D(...) UnsupportedGLFunctionStub("glFramebufferTexture1D")
+static void (*glGetQueryObjectui64v)(GLuint id, GLenum pname, GLuint64* params) = nullptr;
diff --git a/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp
index 96c93e7a..748baa89 100644
--- a/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp
+++ b/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp
@@ -1341,6 +1341,15 @@ void DeviceContextGLImpl::BeginQuery(IQuery* pQuery)
#endif
break;
+ case QUERY_TYPE_DURATION:
+#if GL_TIME_ELAPSED
+ glBeginQuery(GL_TIME_ELAPSED, glQuery);
+ DEV_CHECK_GL_ERROR("Failed to begin GL_TIME_ELAPSED query");
+#else
+ LOG_ERROR_MESSAGE_ONCE("Duration queries are not supported by this device");
+#endif
+ break;
+
default:
UNEXPECTED("Unexpected query type");
}
@@ -1375,11 +1384,25 @@ void DeviceContextGLImpl::EndQuery(IQuery* pQuery)
break;
case QUERY_TYPE_TIMESTAMP:
-#if GL_ARB_timer_query
- glQueryCounter(pQueryGLImpl->GetGlQueryHandle(), GL_TIMESTAMP);
- DEV_CHECK_GL_ERROR("glQueryCounter failed");
+#if GL_TIMESTAMP
+ if (glQueryCounter != nullptr)
+ {
+ glQueryCounter(pQueryGLImpl->GetGlQueryHandle(), GL_TIMESTAMP);
+ DEV_CHECK_GL_ERROR("glQueryCounter failed");
+ }
+ else
+#endif
+ {
+ LOG_ERROR_MESSAGE_ONCE("Timer queries are not supported by this device");
+ }
+ break;
+
+ case QUERY_TYPE_DURATION:
+#if GL_TIME_ELAPSED
+ glEndQuery(GL_TIME_ELAPSED);
+ DEV_CHECK_GL_ERROR("Failed to end GL_TIME_ELAPSED query");
#else
- LOG_ERROR_MESSAGE_ONCE("Timer queries are not supported by this device");
+ LOG_ERROR_MESSAGE_ONCE("Duration queries are not supported by this device");
#endif
break;
diff --git a/Graphics/GraphicsEngineOpenGL/src/GLStubsAndroid.cpp b/Graphics/GraphicsEngineOpenGL/src/GLStubsAndroid.cpp
index dd38c77f..54258fa7 100644
--- a/Graphics/GraphicsEngineOpenGL/src/GLStubsAndroid.cpp
+++ b/Graphics/GraphicsEngineOpenGL/src/GLStubsAndroid.cpp
@@ -199,6 +199,15 @@
DECLARE_GL_FUNCTION( glDebugMessageCallback, PFNGLDEBUGMESSAGECALLBACKPROC, GLDEBUGPROC callback, const void *userParam)
#endif
+#ifdef LOAD_GL_GET_QUERY_OBJECT_UI64V
+ DECLARE_GL_FUNCTION( glGetQueryObjectui64v, PFNGLGETQUERYOBJECTUI64VPROC, GLuint id, GLenum pname, GLuint64* params)
+#endif
+
+#ifdef LOAD_GL_QUERY_COUNTER
+ DECLARE_GL_FUNCTION( glQueryCounter, PFNGLQUERYCOUNTERPROC, GLuint id, GLenum target)
+#endif
+
+
void LoadGLFunctions()
{
@@ -207,71 +216,71 @@ Func = (FuncType)eglGetProcAddress( #Func );\
if( !Func )Func = Func##Stub;
#ifdef LOAD_GL_BIND_IMAGE_TEXTURE
- LOAD_GL_FUNCTION( glBindImageTexture, PFNGLBINDIMAGETEXTUREPROC )
+ LOAD_GL_FUNCTION(glBindImageTexture, PFNGLBINDIMAGETEXTUREPROC)
#endif
#ifdef LOAD_GL_DISPATCH_COMPUTE
- LOAD_GL_FUNCTION( glDispatchCompute, PFNGLDISPATCHCOMPUTEPROC )
+ LOAD_GL_FUNCTION(glDispatchCompute, PFNGLDISPATCHCOMPUTEPROC)
#endif
#ifdef LOAD_GEN_PROGRAM_PIPELINES
- LOAD_GL_FUNCTION( glGenProgramPipelines, PFNGLGENPROGRAMPIPELINESPROC )
+ LOAD_GL_FUNCTION(glGenProgramPipelines, PFNGLGENPROGRAMPIPELINESPROC)
#endif
#ifdef LOAD_GL_DELETE_PROGRAM_PIPELINES
- LOAD_GL_FUNCTION( glDeleteProgramPipelines, PFNGLDELETEPROGRAMPIPELINESPROC )
+ LOAD_GL_FUNCTION(glDeleteProgramPipelines, PFNGLDELETEPROGRAMPIPELINESPROC)
#endif
#ifdef LOAD_GL_BIND_PROGRAM_PIPELINE
- LOAD_GL_FUNCTION( glBindProgramPipeline, PFNGLBINDPROGRAMPIPELINEPROC )
+ LOAD_GL_FUNCTION(glBindProgramPipeline, PFNGLBINDPROGRAMPIPELINEPROC)
#endif
#ifdef LOAD_GL_USE_PROGRAM_STAGES
- LOAD_GL_FUNCTION( glUseProgramStages, PFNGLUSEPROGRAMSTAGESPROC )
+ LOAD_GL_FUNCTION(glUseProgramStages, PFNGLUSEPROGRAMSTAGESPROC)
#endif
#ifdef LOAD_GL_PROGRAM_UNIFORM_1I
- LOAD_GL_FUNCTION( glProgramUniform1i, PFNGLPROGRAMUNIFORM1IPROC )
+ LOAD_GL_FUNCTION(glProgramUniform1i, PFNGLPROGRAMUNIFORM1IPROC)
#endif
#ifdef LOAD_GL_MEMORY_BARRIER
- LOAD_GL_FUNCTION( glMemoryBarrier, PFNGLMEMORYBARRIERPROC )
+ LOAD_GL_FUNCTION(glMemoryBarrier, PFNGLMEMORYBARRIERPROC)
#endif
#ifdef LOAD_DRAW_ELEMENTS_INDIRECT
- LOAD_GL_FUNCTION( glDrawElementsIndirect, PFNGLDRAWELEMENTSINDIRECTPROC )
+ LOAD_GL_FUNCTION(glDrawElementsIndirect, PFNGLDRAWELEMENTSINDIRECTPROC)
#endif
#ifdef LOAD_DRAW_ARRAYS_INDIRECT
- LOAD_GL_FUNCTION( glDrawArraysIndirect, PFNGLDRAWARRAYSINDIRECTPROC )
+ LOAD_GL_FUNCTION(glDrawArraysIndirect, PFNGLDRAWARRAYSINDIRECTPROC)
#endif
#ifdef LOAD_GL_TEX_STORAGE_2D_MULTISAMPLE
- LOAD_GL_FUNCTION( glTexStorage2DMultisample, PFNGLTEXSTORAGE2DMULTISAMPLEPROC )
+ LOAD_GL_FUNCTION(glTexStorage2DMultisample, PFNGLTEXSTORAGE2DMULTISAMPLEPROC)
#endif
#ifdef LOAD_GL_GET_PROGRAM_INTERFACEIV
- LOAD_GL_FUNCTION( glGetProgramInterfaceiv, PFNGLGETPROGRAMINTERFACEIVPROC )
+ LOAD_GL_FUNCTION(glGetProgramInterfaceiv, PFNGLGETPROGRAMINTERFACEIVPROC)
#endif
#ifdef LOAD_GL_GET_PROGRAM_RESOURCE_NAME
- LOAD_GL_FUNCTION( glGetProgramResourceName, PFNGLGETPROGRAMRESOURCENAMEPROC )
+ LOAD_GL_FUNCTION(glGetProgramResourceName, PFNGLGETPROGRAMRESOURCENAMEPROC)
#endif
#ifdef LOAD_GL_GET_PROGRAM_RESOURCE_INDEX
- LOAD_GL_FUNCTION( glGetProgramResourceIndex, PFNGLGETPROGRAMRESOURCEINDEXPROC )
+ LOAD_GL_FUNCTION(glGetProgramResourceIndex, PFNGLGETPROGRAMRESOURCEINDEXPROC)
#endif
#ifdef LOAD_GL_GET_PROGRAM_RESOURCEIV
- LOAD_GL_FUNCTION( glGetProgramResourceiv, PFNGLGETPROGRAMRESOURCEIVPROC )
+ LOAD_GL_FUNCTION(glGetProgramResourceiv, PFNGLGETPROGRAMRESOURCEIVPROC)
#endif
#ifdef LOAD_DISPATCH_COMPUTE_INDIRECT
- LOAD_GL_FUNCTION( glDispatchComputeIndirect, PFNGLDISPATCHCOMPUTEINDIRECTPROC )
+ LOAD_GL_FUNCTION(glDispatchComputeIndirect, PFNGLDISPATCHCOMPUTEINDIRECTPROC)
#endif
#ifdef LOAD_GL_TEX_BUFFER
- LOAD_GL_FUNCTION( glTexBuffer, PFNGLTEXBUFFERPROC )
+ LOAD_GL_FUNCTION(glTexBuffer, PFNGLTEXBUFFERPROC)
#endif
#ifdef LOAD_GL_POLYGON_MODE
@@ -279,43 +288,43 @@ Func = (FuncType)eglGetProcAddress( #Func );\
#endif
#ifdef LOAD_GL_ENABLEI
- LOAD_GL_FUNCTION( glEnablei, PFNGLENABLEIPROC)
+ LOAD_GL_FUNCTION(glEnablei, PFNGLENABLEIPROC)
#endif
#ifdef LOAD_GL_BLEND_FUNC_SEPARATEI
- LOAD_GL_FUNCTION( glBlendFuncSeparatei, PFNGLBLENDFUNCSEPARATEIPROC )
+ LOAD_GL_FUNCTION(glBlendFuncSeparatei, PFNGLBLENDFUNCSEPARATEIPROC)
#endif
#ifdef LOAD_GL_BLEND_EQUATION_SEPARATEI
- LOAD_GL_FUNCTION( glBlendEquationSeparatei, PFNGLBLENDEQUATIONSEPARATEIPROC )
+ LOAD_GL_FUNCTION(glBlendEquationSeparatei, PFNGLBLENDEQUATIONSEPARATEIPROC)
#endif
#ifdef LOAD_GL_DISABLEI
- LOAD_GL_FUNCTION( glDisablei, PFNGLDISABLEIPROC )
+ LOAD_GL_FUNCTION(glDisablei, PFNGLDISABLEIPROC)
#endif
#ifdef LOAD_GL_COLOR_MASKI
- LOAD_GL_FUNCTION( glColorMaski, PFNGLCOLORMASKIPROC )
+ LOAD_GL_FUNCTION(glColorMaski, PFNGLCOLORMASKIPROC)
#endif
#ifdef LOAD_GL_VIEWPORT_INDEXEDF
- LOAD_GL_FUNCTION( glViewportIndexedf, PFNGLVIEWPORTINDEXEDFPROC )
+ LOAD_GL_FUNCTION(glViewportIndexedf, PFNGLVIEWPORTINDEXEDFPROC)
#endif
#ifdef LOAD_GL_SCISSOR_INDEXED
- LOAD_GL_FUNCTION( glScissorIndexed, PFNGLSCISSORINDEXEDPROC )
+ LOAD_GL_FUNCTION(glScissorIndexed, PFNGLSCISSORINDEXEDPROC)
#endif
#ifdef LOAD_GL_FRAMEBUFFER_TEXTURE
- LOAD_GL_FUNCTION( glFramebufferTexture, PFNGLFRAMEBUFFERTEXTUREPROC )
+ LOAD_GL_FUNCTION(glFramebufferTexture, PFNGLFRAMEBUFFERTEXTUREPROC)
#endif
#ifdef LOAD_GL_FRAMEBUFFER_TEXTURE_1D
- LOAD_GL_FUNCTION( glFramebufferTexture1D, PFNGLFRAMEBUFFERTEXTURE1DPROC )
+ LOAD_GL_FUNCTION(glFramebufferTexture1D, PFNGLFRAMEBUFFERTEXTURE1DPROC)
#endif
#ifdef LOAD_GL_FRAMEBUFFER_TEXTURE_3D
- LOAD_GL_FUNCTION( glFramebufferTexture3D, PFNGLFRAMEBUFFERTEXTURE3DPROC )
+ LOAD_GL_FUNCTION(glFramebufferTexture3D, PFNGLFRAMEBUFFERTEXTURE3DPROC)
#endif
#ifdef LOAD_GL_COPY_IMAGE_SUB_DATA
@@ -340,30 +349,40 @@ Func = (FuncType)eglGetProcAddress( #Func );\
#endif
#ifdef LOAD_GL_TEXTURE_VIEW
- LOAD_GL_FUNCTION( glTextureView, PFNGLTEXTUREVIEWPROC)
+ LOAD_GL_FUNCTION(glTextureView, PFNGLTEXTUREVIEWPROC)
#endif
#ifdef LOAD_GL_DRAW_ELEMENTS_INSTANCED_BASE_VERTEX_BASE_INSTANCE
- LOAD_GL_FUNCTION( glDrawElementsInstancedBaseVertexBaseInstance, PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)
+ LOAD_GL_FUNCTION(glDrawElementsInstancedBaseVertexBaseInstance, PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)
#endif
#ifdef LOAD_GL_DRAW_ELEMENTS_INSTANCED_BASE_VERTEX
- LOAD_GL_FUNCTION( glDrawElementsInstancedBaseVertex, PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)
+ LOAD_GL_FUNCTION(glDrawElementsInstancedBaseVertex, PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)
#endif
#ifdef LOAD_GL_DRAW_ELEMENTS_INSTANCED_BASE_INSTANCE
- LOAD_GL_FUNCTION( glDrawElementsInstancedBaseInstance, PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)
+ LOAD_GL_FUNCTION(glDrawElementsInstancedBaseInstance, PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)
#endif
#ifdef LOAD_GL_DRAW_ARRAYS_INSTANCED_BASE_INSTANCE
- LOAD_GL_FUNCTION( glDrawArraysInstancedBaseInstance, PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)
+ LOAD_GL_FUNCTION(glDrawArraysInstancedBaseInstance, PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)
#endif
#ifdef LOAD_GL_DRAW_ELEMENTS_BASE_VERTEX
- LOAD_GL_FUNCTION( glDrawElementsBaseVertex, PFNGLDRAWELEMENTSBASEVERTEXPROC)
+ LOAD_GL_FUNCTION(glDrawElementsBaseVertex, PFNGLDRAWELEMENTSBASEVERTEXPROC)
#endif
#ifdef LOAD_DEBUG_MESSAGE_CALLBACK
- LOAD_GL_FUNCTION( glDebugMessageCallback, PFNGLDEBUGMESSAGECALLBACKPROC)
+ LOAD_GL_FUNCTION(glDebugMessageCallback, PFNGLDEBUGMESSAGECALLBACKPROC)
+#endif
+
+#ifdef LOAD_GL_GET_QUERY_OBJECT_UI64V
+ // Do not use stub
+ glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC)eglGetProcAddress( "glGetQueryObjectui64vEXT" );
+#endif
+
+#ifdef LOAD_GL_QUERY_COUNTER
+ // Do not use stub
+ glQueryCounter = (PFNGLQUERYCOUNTERPROC)eglGetProcAddress( "glQueryCounterEXT" );
#endif
}
diff --git a/Graphics/GraphicsEngineOpenGL/src/QueryGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/QueryGLImpl.cpp
index 0666194c..82d8b05b 100644
--- a/Graphics/GraphicsEngineOpenGL/src/QueryGLImpl.cpp
+++ b/Graphics/GraphicsEngineOpenGL/src/QueryGLImpl.cpp
@@ -71,9 +71,8 @@ bool QueryGLImpl::GetData(void* pData, Uint32 DataSize, bool AutoInvalidate)
case QUERY_TYPE_PIPELINE_STATISTICS:
#endif
-#if GL_ARB_timer_query
+ case QUERY_TYPE_DURATION:
case QUERY_TYPE_TIMESTAMP:
-#endif
glGetQueryObjectuiv(m_GlQuery, GL_QUERY_RESULT_AVAILABLE, &ResultAvailable);
CHECK_GL_ERROR("Failed to get query result");
break;
@@ -120,16 +119,29 @@ bool QueryGLImpl::GetData(void* pData, Uint32 DataSize, bool AutoInvalidate)
break;
case QUERY_TYPE_TIMESTAMP:
+ case QUERY_TYPE_DURATION:
{
-#if GL_ARB_timer_query
- auto& QueryData = *reinterpret_cast<QueryDataTimestamp*>(pData);
- GLuint64 Counter = 0;
- glGetQueryObjectui64v(m_GlQuery, GL_QUERY_RESULT, &Counter);
- CHECK_GL_ERROR("Failed to get query result");
- QueryData.Counter = Counter;
- // Counter is always measured in nanoseconds (10^-9 seconds)
- QueryData.Frequency = 1000000000;
-#endif
+ if (glGetQueryObjectui64v != nullptr)
+ {
+ GLuint64 Counter = 0;
+ glGetQueryObjectui64v(m_GlQuery, GL_QUERY_RESULT, &Counter);
+ CHECK_GL_ERROR("Failed to get query result");
+ if (m_Desc.Type == QUERY_TYPE_TIMESTAMP)
+ {
+ auto& QueryData = *reinterpret_cast<QueryDataTimestamp*>(pData);
+ QueryData.Counter = Counter;
+ // Counter is always measured in nanoseconds (10^-9 seconds)
+ QueryData.Frequency = 1000000000;
+ }
+ else
+ {
+ VERIFY_EXPR(m_Desc.Type == QUERY_TYPE_DURATION);
+ auto& QueryData = *reinterpret_cast<QueryDataDuration*>(pData);
+ QueryData.Duration = Counter;
+ // Counter is always measured in nanoseconds (10^-9 seconds)
+ QueryData.Frequency = 1000000000;
+ }
+ }
}
break;
diff --git a/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp
index ae77fbcf..6d0948ae 100644
--- a/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp
+++ b/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp
@@ -156,10 +156,11 @@ RenderDeviceGLImpl::RenderDeviceGLImpl(IReferenceCounters* pRefCounters,
Features.GeometryShaders = MajorVersion >= 4 || CheckExtension("GL_ARB_geometry_shader4");
Features.Tessellation = MajorVersion >= 4 || CheckExtension("GL_ARB_tessellation_shader");
Features.BindlessResources = False;
- Features.OcclusionQueries = True;
- Features.BinaryOcclusionQueries = True;
- Features.TimestampQueries = True;
- Features.PipelineStatisticsQueries = True;
+ Features.OcclusionQueries = True; // Present since 3.3
+ Features.BinaryOcclusionQueries = True; // Present since 3.3
+ Features.TimestampQueries = True; // Present since 3.3
+ Features.PipelineStatisticsQueries = True; // Present since 3.3
+ Features.DurationQueries = True; // Present since 3.3
Features.DepthBiasClamp = False; // There is no depth bias clamp in OpenGL
Features.DepthClamp = MajorVersion >= 4 || CheckExtension("GL_ARB_depth_clamp");
Features.IndependentBlend = True;
@@ -203,16 +204,22 @@ RenderDeviceGLImpl::RenderDeviceGLImpl(IReferenceCounters* pRefCounters,
Features.Tessellation = IsGLES32OrAbove || strstr(Extensions, "tessellation_shader");
Features.BindlessResources = False;
Features.OcclusionQueries = False;
- Features.BinaryOcclusionQueries = False;
- Features.TimestampQueries = False;
- Features.PipelineStatisticsQueries = False;
- Features.DepthBiasClamp = False; // There is no depth bias clamp in OpenGL
- Features.DepthClamp = strstr(Extensions, "depth_clamp");
- Features.IndependentBlend = IsGLES32OrAbove;
- Features.DualSourceBlend = strstr(Extensions, "blend_func_extended");
- Features.MultiViewport = strstr(Extensions, "viewport_array");
- Features.PixelUAVWritesAndAtomics = IsGLES31OrAbove || strstr(Extensions, "shader_image_load_store");
- Features.TextureUAVExtendedFormats = False;
+ Features.BinaryOcclusionQueries = True; // Supported in GLES3.0
+#if GL_TIMESTAMP
+ Features.TimestampQueries = strstr(Extensions, "disjoint_timer_query");
+ Features.DurationQueries = Features.TimestampQueries;
+#else
+ Features.TimestampQueries = False;
+ Features.DurationQueries = False;
+#endif
+ Features.PipelineStatisticsQueries = False;
+ Features.DepthBiasClamp = False; // There is no depth bias clamp in OpenGL
+ Features.DepthClamp = strstr(Extensions, "depth_clamp");
+ Features.IndependentBlend = IsGLES32OrAbove;
+ Features.DualSourceBlend = strstr(Extensions, "blend_func_extended");
+ Features.MultiViewport = strstr(Extensions, "viewport_array");
+ Features.PixelUAVWritesAndAtomics = IsGLES31OrAbove || strstr(Extensions, "shader_image_load_store");
+ Features.TextureUAVExtendedFormats = False;
TexCaps.MaxTexture1DDimension = 0; // Not supported in GLES 3.2