From c1cb8cc737e94bfb674c02931d72e318f218e7a2 Mon Sep 17 00:00:00 2001 From: assiduous Date: Tue, 25 Aug 2020 13:10:54 -0700 Subject: Enabled loading of timer query GL functions on Android --- .../GraphicsEngineOpenGL/include/GLStubsAndroid.h | 20 +++++ .../src/DeviceContextGLImpl.cpp | 15 ++-- .../GraphicsEngineOpenGL/src/GLStubsAndroid.cpp | 85 +++++++++++++--------- Graphics/GraphicsEngineOpenGL/src/QueryGLImpl.cpp | 21 +++--- .../src/RenderDeviceGLImpl.cpp | 12 +-- 5 files changed, 96 insertions(+), 57 deletions(-) (limited to 'Graphics/GraphicsEngineOpenGL') 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 @@ -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(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(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"); -- cgit v1.2.3 From 8f8cae971c7382de88608655f24be278b87d5e42 Mon Sep 17 00:00:00 2001 From: assiduous Date: Tue, 25 Aug 2020 13:36:06 -0700 Subject: Enabled duration queries in GL backend --- .../src/DeviceContextGLImpl.cpp | 10 ++++++++++ .../GraphicsEngineOpenGL/src/GLStubsAndroid.cpp | 4 +++- Graphics/GraphicsEngineOpenGL/src/QueryGLImpl.cpp | 23 +++++++++++++++++----- .../src/RenderDeviceGLImpl.cpp | 2 ++ 4 files changed, 33 insertions(+), 6 deletions(-) (limited to 'Graphics/GraphicsEngineOpenGL') diff --git a/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp index e1755125..a479cb49 100644 --- a/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp @@ -1331,6 +1331,11 @@ void DeviceContextGLImpl::BeginQuery(IQuery* pQuery) #endif break; + case QUERY_TYPE_DURATION: + glBeginQuery(GL_TIME_ELAPSED, glQuery); + DEV_CHECK_GL_ERROR("Failed to begin GL_TIME_ELAPSED query"); + break; + default: UNEXPECTED("Unexpected query type"); } @@ -1376,6 +1381,11 @@ void DeviceContextGLImpl::EndQuery(IQuery* pQuery) } break; + case QUERY_TYPE_DURATION: + glEndQuery(GL_TIME_ELAPSED); + DEV_CHECK_GL_ERROR("Failed to end GL_TIME_ELAPSED query"); + break; + default: UNEXPECTED("Unexpected query type"); } diff --git a/Graphics/GraphicsEngineOpenGL/src/GLStubsAndroid.cpp b/Graphics/GraphicsEngineOpenGL/src/GLStubsAndroid.cpp index 428764ee..e426b2ca 100644 --- a/Graphics/GraphicsEngineOpenGL/src/GLStubsAndroid.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/GLStubsAndroid.cpp @@ -377,10 +377,12 @@ Func = (FuncType)eglGetProcAddress( #Func );\ #endif #ifdef LOAD_GL_GET_QUERY_OBJECT_UI64V - LOAD_GL_FUNCTION(glGetQueryObjectui64v, PFNGLGETQUERYOBJECTUI64VPROC) + // Do not use stub + glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC)eglGetProcAddress( "glGetQueryObjectui64v" ); #endif #ifdef LOAD_GL_QUERY_COUNTER + // Do not use stub glQueryCounter = (PFNGLQUERYCOUNTERPROC)eglGetProcAddress( "glQueryCounter" ); #endif } diff --git a/Graphics/GraphicsEngineOpenGL/src/QueryGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/QueryGLImpl.cpp index fd04362c..82d8b05b 100644 --- a/Graphics/GraphicsEngineOpenGL/src/QueryGLImpl.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/QueryGLImpl.cpp @@ -71,6 +71,7 @@ bool QueryGLImpl::GetData(void* pData, Uint32 DataSize, bool AutoInvalidate) case QUERY_TYPE_PIPELINE_STATISTICS: #endif + case QUERY_TYPE_DURATION: case QUERY_TYPE_TIMESTAMP: glGetQueryObjectuiv(m_GlQuery, GL_QUERY_RESULT_AVAILABLE, &ResultAvailable); CHECK_GL_ERROR("Failed to get query result"); @@ -118,16 +119,28 @@ bool QueryGLImpl::GetData(void* pData, Uint32 DataSize, bool AutoInvalidate) break; case QUERY_TYPE_TIMESTAMP: + case QUERY_TYPE_DURATION: { if (glGetQueryObjectui64v != nullptr) { - auto& QueryData = *reinterpret_cast(pData); - GLuint64 Counter = 0; + 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; + if (m_Desc.Type == QUERY_TYPE_TIMESTAMP) + { + auto& QueryData = *reinterpret_cast(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(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 9b267441..ff9c95e0 100644 --- a/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp @@ -160,6 +160,7 @@ RenderDeviceGLImpl::RenderDeviceGLImpl(IReferenceCounters* pRefCounters, 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; @@ -206,6 +207,7 @@ RenderDeviceGLImpl::RenderDeviceGLImpl(IReferenceCounters* pRefCounters, Features.BinaryOcclusionQueries = True; // Supported in GLES3.0 Features.TimestampQueries = strstr(Extensions, "disjoint_timer_query") && glQueryCounter != nullptr; Features.PipelineStatisticsQueries = False; + Features.DurationQueries = strstr(Extensions, "disjoint_timer_query") && glGetQueryObjectui64v != nullptr; Features.DepthBiasClamp = False; // There is no depth bias clamp in OpenGL Features.DepthClamp = strstr(Extensions, "depth_clamp"); Features.IndependentBlend = IsGLES32OrAbove; -- cgit v1.2.3 From ffe44b195f335689829c5e441d1072ee7d8eac9d Mon Sep 17 00:00:00 2001 From: assiduous Date: Tue, 25 Aug 2020 15:02:47 -0700 Subject: Fixed GLES query function names --- .../src/DeviceContextGLImpl.cpp | 2 ++ .../GraphicsEngineOpenGL/src/GLStubsAndroid.cpp | 6 ++++-- .../src/RenderDeviceGLImpl.cpp | 22 +++++++++++++--------- 3 files changed, 19 insertions(+), 11 deletions(-) (limited to 'Graphics/GraphicsEngineOpenGL') diff --git a/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp index e1755125..b5558a8d 100644 --- a/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp @@ -1365,6 +1365,7 @@ void DeviceContextGLImpl::EndQuery(IQuery* pQuery) break; case QUERY_TYPE_TIMESTAMP: +#if GL_TIMESTAMP if (glQueryCounter != nullptr) { glQueryCounter(pQueryGLImpl->GetGlQueryHandle(), GL_TIMESTAMP); @@ -1374,6 +1375,7 @@ void DeviceContextGLImpl::EndQuery(IQuery* pQuery) { LOG_ERROR_MESSAGE_ONCE("Timer queries are not supported by this device"); } +#endif break; default: diff --git a/Graphics/GraphicsEngineOpenGL/src/GLStubsAndroid.cpp b/Graphics/GraphicsEngineOpenGL/src/GLStubsAndroid.cpp index 428764ee..54258fa7 100644 --- a/Graphics/GraphicsEngineOpenGL/src/GLStubsAndroid.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/GLStubsAndroid.cpp @@ -377,10 +377,12 @@ Func = (FuncType)eglGetProcAddress( #Func );\ #endif #ifdef LOAD_GL_GET_QUERY_OBJECT_UI64V - LOAD_GL_FUNCTION(glGetQueryObjectui64v, PFNGLGETQUERYOBJECTUI64VPROC) + // Do not use stub + glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC)eglGetProcAddress( "glGetQueryObjectui64vEXT" ); #endif #ifdef LOAD_GL_QUERY_COUNTER - glQueryCounter = (PFNGLQUERYCOUNTERPROC)eglGetProcAddress( "glQueryCounter" ); + // Do not use stub + glQueryCounter = (PFNGLQUERYCOUNTERPROC)eglGetProcAddress( "glQueryCounterEXT" ); #endif } diff --git a/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp index 9b267441..17bc8346 100644 --- a/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp @@ -204,15 +204,19 @@ RenderDeviceGLImpl::RenderDeviceGLImpl(IReferenceCounters* pRefCounters, Features.BindlessResources = False; Features.OcclusionQueries = 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"); - 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; +#if GL_TIMESTAMP + Features.TimestampQueries = strstr(Extensions, "disjoint_timer_query"); +#else + Features.TimestampQueries = 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 -- cgit v1.2.3 From f1a6ac2e44bc09993b8730611f5a2cd525af7cab Mon Sep 17 00:00:00 2001 From: assiduous Date: Tue, 25 Aug 2020 15:15:54 -0700 Subject: Fixed iOS build error --- Graphics/GraphicsEngineOpenGL/include/GLStubsIOS.h | 1 + 1 file changed, 1 insertion(+) (limited to 'Graphics/GraphicsEngineOpenGL') diff --git a/Graphics/GraphicsEngineOpenGL/include/GLStubsIOS.h b/Graphics/GraphicsEngineOpenGL/include/GLStubsIOS.h index bebbc669..884350d7 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; -- cgit v1.2.3 From 81bae8395e2ecdc0ab7523a5ecb35a79647bc369 Mon Sep 17 00:00:00 2001 From: assiduous Date: Tue, 25 Aug 2020 15:39:53 -0700 Subject: Fixed formatting --- Graphics/GraphicsEngineOpenGL/include/GLStubsIOS.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Graphics/GraphicsEngineOpenGL') diff --git a/Graphics/GraphicsEngineOpenGL/include/GLStubsIOS.h b/Graphics/GraphicsEngineOpenGL/include/GLStubsIOS.h index 884350d7..4e5ec188 100644 --- a/Graphics/GraphicsEngineOpenGL/include/GLStubsIOS.h +++ b/Graphics/GraphicsEngineOpenGL/include/GLStubsIOS.h @@ -544,4 +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; +static void (*glGetQueryObjectui64v)(GLuint id, GLenum pname, GLuint64* params) = nullptr; -- cgit v1.2.3 From 49be75e82241dbd5aa8959dcc4d3ba39a8a7a28c Mon Sep 17 00:00:00 2001 From: assiduous Date: Thu, 27 Aug 2020 12:33:45 -0700 Subject: Implemented duration queries in Vulkan --- Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'Graphics/GraphicsEngineOpenGL') diff --git a/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp index 7612287b..c1f038bf 100644 --- a/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp @@ -1377,15 +1377,19 @@ void DeviceContextGLImpl::EndQuery(IQuery* pQuery) DEV_CHECK_GL_ERROR("glQueryCounter failed"); } else +#endif { LOG_ERROR_MESSAGE_ONCE("Timer queries are not supported by this device"); } -#endif 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("Duration queries are not supported by this device"); +#endif break; default: -- cgit v1.2.3 From 5d4ad2a5f23d031589f459391a5d5754169618cd Mon Sep 17 00:00:00 2001 From: assiduous Date: Thu, 27 Aug 2020 13:24:32 -0700 Subject: Fixed iOS build issue --- Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'Graphics/GraphicsEngineOpenGL') diff --git a/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp index c1f038bf..49f78cb3 100644 --- a/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp @@ -1332,8 +1332,12 @@ void DeviceContextGLImpl::BeginQuery(IQuery* pQuery) 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: -- cgit v1.2.3