summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineOpenGL
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2020-08-25 20:10:54 +0000
committerassiduous <assiduous@diligentgraphics.com>2020-08-25 20:10:54 +0000
commitc1cb8cc737e94bfb674c02931d72e318f218e7a2 (patch)
treee7354a46c4667e8a0a868956e29279fcd6baa719 /Graphics/GraphicsEngineOpenGL
parentFixed buffer creation test on Vulkan/Intel; improved texture test failure output (diff)
downloadDiligentCore-c1cb8cc737e94bfb674c02931d72e318f218e7a2.tar.gz
DiligentCore-c1cb8cc737e94bfb674c02931d72e318f218e7a2.zip
Enabled loading of timer query GL functions on Android
Diffstat (limited to 'Graphics/GraphicsEngineOpenGL')
-rw-r--r--Graphics/GraphicsEngineOpenGL/include/GLStubsAndroid.h20
-rw-r--r--Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp15
-rw-r--r--Graphics/GraphicsEngineOpenGL/src/GLStubsAndroid.cpp85
-rw-r--r--Graphics/GraphicsEngineOpenGL/src/QueryGLImpl.cpp21
-rw-r--r--Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp12
5 files changed, 96 insertions, 57 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/src/DeviceContextGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp
index 4155f51e..e1755125 100644
--- a/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp
+++ b/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp
@@ -1365,12 +1365,15 @@ 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");
-#else
- LOG_ERROR_MESSAGE_ONCE("Timer queries are not supported by this device");
-#endif
+ if (glQueryCounter != nullptr)
+ {
+ glQueryCounter(pQueryGLImpl->GetGlQueryHandle(), GL_TIMESTAMP);
+ DEV_CHECK_GL_ERROR("glQueryCounter failed");
+ }
+ else
+ {
+ LOG_ERROR_MESSAGE_ONCE("Timer queries are not supported by this device");
+ }
break;
default:
diff --git a/Graphics/GraphicsEngineOpenGL/src/GLStubsAndroid.cpp b/Graphics/GraphicsEngineOpenGL/src/GLStubsAndroid.cpp
index dd38c77f..428764ee 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,38 @@ 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
+ LOAD_GL_FUNCTION(glGetQueryObjectui64v, PFNGLGETQUERYOBJECTUI64VPROC)
+#endif
+
+#ifdef LOAD_GL_QUERY_COUNTER
+ glQueryCounter = (PFNGLQUERYCOUNTERPROC)eglGetProcAddress( "glQueryCounter" );
#endif
}
diff --git a/Graphics/GraphicsEngineOpenGL/src/QueryGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/QueryGLImpl.cpp
index 0666194c..fd04362c 100644
--- a/Graphics/GraphicsEngineOpenGL/src/QueryGLImpl.cpp
+++ b/Graphics/GraphicsEngineOpenGL/src/QueryGLImpl.cpp
@@ -71,9 +71,7 @@ bool QueryGLImpl::GetData(void* pData, Uint32 DataSize, bool AutoInvalidate)
case QUERY_TYPE_PIPELINE_STATISTICS:
#endif
-#if GL_ARB_timer_query
case QUERY_TYPE_TIMESTAMP:
-#endif
glGetQueryObjectuiv(m_GlQuery, GL_QUERY_RESULT_AVAILABLE, &ResultAvailable);
CHECK_GL_ERROR("Failed to get query result");
break;
@@ -121,15 +119,16 @@ bool QueryGLImpl::GetData(void* pData, Uint32 DataSize, bool AutoInvalidate)
case QUERY_TYPE_TIMESTAMP:
{
-#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)
+ {
+ 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;
+ }
}
break;
diff --git a/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp
index ae77fbcf..9b267441 100644
--- a/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp
+++ b/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp
@@ -156,10 +156,10 @@ 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.DepthBiasClamp = False; // There is no depth bias clamp in OpenGL
Features.DepthClamp = MajorVersion >= 4 || CheckExtension("GL_ARB_depth_clamp");
Features.IndependentBlend = True;
@@ -203,8 +203,8 @@ RenderDeviceGLImpl::RenderDeviceGLImpl(IReferenceCounters* pRefCounters,
Features.Tessellation = IsGLES32OrAbove || strstr(Extensions, "tessellation_shader");
Features.BindlessResources = False;
Features.OcclusionQueries = False;
- Features.BinaryOcclusionQueries = False;
- Features.TimestampQueries = False;
+ Features.BinaryOcclusionQueries = True; // Supported in GLES3.0
+ Features.TimestampQueries = strstr(Extensions, "disjoint_timer_query") && glQueryCounter != nullptr;
Features.PipelineStatisticsQueries = False;
Features.DepthBiasClamp = False; // There is no depth bias clamp in OpenGL
Features.DepthClamp = strstr(Extensions, "depth_clamp");