diff options
| author | azhirnov <zh1dron@gmail.com> | 2020-08-31 12:04:27 +0000 |
|---|---|---|
| committer | azhirnov <zh1dron@gmail.com> | 2020-08-31 12:09:36 +0000 |
| commit | ab1149384b1185eb1b22eab8344055f82f9e10cb (patch) | |
| tree | 8221754353a7250d0a0b3ef84d229200c623f67b /Graphics/GraphicsEngineOpenGL | |
| parent | removed unused DXILUtils, fixed some Codacy issues (diff) | |
| parent | Added C API for IReferenceCounters (diff) | |
| download | DiligentCore-ab1149384b1185eb1b22eab8344055f82f9e10cb.tar.gz DiligentCore-ab1149384b1185eb1b22eab8344055f82f9e10cb.zip | |
Merge branch 'master' into mesh_shader
# Conflicts:
# Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp
Diffstat (limited to 'Graphics/GraphicsEngineOpenGL')
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 |
