diff options
| author | assiduous <assiduous@diligentgraphics.com> | 2020-08-25 20:10:54 +0000 |
|---|---|---|
| committer | assiduous <assiduous@diligentgraphics.com> | 2020-08-25 20:10:54 +0000 |
| commit | c1cb8cc737e94bfb674c02931d72e318f218e7a2 (patch) | |
| tree | e7354a46c4667e8a0a868956e29279fcd6baa719 /Graphics/GraphicsEngineOpenGL | |
| parent | Fixed buffer creation test on Vulkan/Intel; improved texture test failure output (diff) | |
| download | DiligentCore-c1cb8cc737e94bfb674c02931d72e318f218e7a2.tar.gz DiligentCore-c1cb8cc737e94bfb674c02931d72e318f218e7a2.zip | |
Enabled loading of timer query GL functions on Android
Diffstat (limited to 'Graphics/GraphicsEngineOpenGL')
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"); |
