From cc993ea204a0b503abc8526b0dcd88709ff5e5bf Mon Sep 17 00:00:00 2001 From: Mark Janes Date: Thu, 22 Feb 2018 16:56:18 -0800 Subject: [PATCH 1/7] Generate static lib It is better to link static if possible, because it simplifies installation and eliminates the need to dlopen. --- Src/GPUPerfAPIGL/makefile | 3 +++ Src/GPUPerfAPIGLES/makefile | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Src/GPUPerfAPIGL/makefile b/Src/GPUPerfAPIGL/makefile index 21880e1a..59e10fd1 100644 --- a/Src/GPUPerfAPIGL/makefile +++ b/Src/GPUPerfAPIGL/makefile @@ -4,6 +4,7 @@ DEPTH = ../.. include $(DEPTH)/Build/Linux/Common.mk TARGETSO = libGPUPerfAPIGL$(TARGET_SUFFIX).so +TARGETLIB = libGPUPerfAPIGL$(TARGET_SUFFIX).a ADDL_DEFINES = -DGLX_GLXEXT_PROTOTYPES INCLUDES = -I. \ @@ -30,5 +31,7 @@ SO_OBJS = \ ./$(OBJ_DIR)/GPUPerfAPIGL.o \ ./$(OBJ_DIR)/GLPerfMonitorCache.o +LIB_OBJS = $(SO_OBJS) + include $(DEPTH)/Build/Linux/CommonTargets.mk diff --git a/Src/GPUPerfAPIGLES/makefile b/Src/GPUPerfAPIGLES/makefile index d1d76097..37ef259a 100644 --- a/Src/GPUPerfAPIGLES/makefile +++ b/Src/GPUPerfAPIGLES/makefile @@ -3,7 +3,9 @@ DEPTH = ../.. include $(DEPTH)/Build/Linux/Common.mk -TARGETSO = libGPUPerfAPIGLES$(TARGET_SUFFIX).so +# TARGETSO = libGPUPerfAPIGLES$(TARGET_SUFFIX).so +TARGETLIB = libGPUPerfAPIGLES$(TARGET_SUFFIX).a + ADDL_DEFINES = -DGLX_GLXEXT_PROTOTYPES -DGLES INCLUDES = -I. \ @@ -30,5 +32,7 @@ SO_OBJS = \ ./$(OBJ_DIR)/GPUPerfAPIGL.o \ ./$(OBJ_DIR)/GLPerfMonitorCache.o +LIB_OBJS = $(SO_OBJS) + include $(DEPTH)/Build/Linux/CommonTargets.mk From 187f090754337b86caa65de363011232d45d88cc Mon Sep 17 00:00:00 2001 From: Mark Janes Date: Thu, 22 Feb 2018 16:56:01 -0800 Subject: [PATCH 2/7] Disable rtti Apitrace compiles with no rtti. If possible, allow ADDL_CFLAGS to be specified at build/configuration time. --- Build/Linux/Common.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Build/Linux/Common.mk b/Build/Linux/Common.mk index 2c551852..268e7905 100644 --- a/Build/Linux/Common.mk +++ b/Build/Linux/Common.mk @@ -8,7 +8,7 @@ LINKFLAGS_SO = -shared -Wl,-z,defs $(ADDL_LINKFLAGS) PLATFORM_CFLAG = PLATFORM_LFLAG = TARGET_SUFFIX = -ADDL_CFLAGS = +ADDL_CFLAGS = -fno-rtti CFLAGS = -std=c++11 $(OPTIMIZE) -fPIC -D_LINUX -Wno-write-strings $(PLATFORM_CFLAG) $(ADDL_CFLAGS) # ADDLCFLAGS = -Wall -Wno-unknown-pragmas -Wno-strict-aliasing -Wno-non-virtual-dtor -Werror -msse PLATFORM_DIR = x64 From b3264bfa6d6ce3c238c3ff0c079f1045d341f83d Mon Sep 17 00:00:00 2001 From: Mark Janes Date: Fri, 23 Feb 2018 15:16:44 -0800 Subject: [PATCH 3/7] Resolve clashes on apitrace entry points This is only a problem due to static linking. --- Src/GPUPerfAPICounterGenerator/GLEntryPoints.h | 8 ++++---- Src/GPUPerfAPIGL/GPUPerfAPIGL.cpp | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Src/GPUPerfAPICounterGenerator/GLEntryPoints.h b/Src/GPUPerfAPICounterGenerator/GLEntryPoints.h index 0f1e3fb8..e0857a9d 100644 --- a/Src/GPUPerfAPICounterGenerator/GLEntryPoints.h +++ b/Src/GPUPerfAPICounterGenerator/GLEntryPoints.h @@ -29,9 +29,9 @@ extern decltype(wglGetProcAddress)* _wglGetProcAddress; ///< function pointer fo #endif #ifdef _LINUX -extern decltype(glXGetProcAddressARB)* _glXGetProcAddressARB; ///< function pointer for glXGetProcAddressARB +extern decltype(glXGetProcAddressARB)* _GPAglXGetProcAddressARB; ///< function pointer for glXGetProcAddressARB #define GET_PROC_ADDRESS(f,type,name)\ - (f) = (type) _glXGetProcAddressARB( (const GLubyte*) name); + (f) = (type) _GPAglXGetProcAddressARB( (const GLubyte*) name); #endif #else @@ -49,9 +49,9 @@ extern decltype(glXGetProcAddressARB)* _glXGetProcAddressARB; ///< function poin #include // used for defining the proc addresses which are initialized below -extern decltype(eglGetProcAddress)* _eglGetProcAddress; ///< function pointer for eglGetProcAddress +extern decltype(eglGetProcAddress)* _GPAeglGetProcAddress; ///< function pointer for eglGetProcAddress #define GET_PROC_ADDRESS(f,type,name)\ - (f) = (type) _eglGetProcAddress(name); + (f) = (type) _GPAeglGetProcAddress(name); #endif // GLES diff --git a/Src/GPUPerfAPIGL/GPUPerfAPIGL.cpp b/Src/GPUPerfAPIGL/GPUPerfAPIGL.cpp index ca99e87b..64dd72d6 100644 --- a/Src/GPUPerfAPIGL/GPUPerfAPIGL.cpp +++ b/Src/GPUPerfAPIGL/GPUPerfAPIGL.cpp @@ -214,11 +214,11 @@ gpa_uint32 GPA_IMP_GetPreferredCheckResultFrequency() #endif #ifdef _LINUX - decltype(glXGetProcAddressARB)* _glXGetProcAddressARB = nullptr; + decltype(glXGetProcAddressARB)* _GPAglXGetProcAddressARB = nullptr; #endif #else - decltype(eglGetProcAddress)* _eglGetProcAddress = nullptr; + decltype(eglGetProcAddress)* _GPAeglGetProcAddress = nullptr; #endif /// Checks the OpenGL extensions and initializes the various function pointers. The extensions queried are: @@ -264,9 +264,9 @@ GPA_Status InitializeGLFunctions() #endif #ifdef _LINUX - _glXGetProcAddressARB = reinterpret_cast(dlsym(module, "glXGetProcAddressARB")); + _GPAglXGetProcAddressARB = reinterpret_cast(dlsym(module, "glXGetProcAddressARB")); - if (nullptr == _glXGetProcAddressARB) + if (nullptr == _GPAglXGetProcAddressARB) { return GPA_STATUS_ERROR_NULL_POINTER; } @@ -276,9 +276,9 @@ GPA_Status InitializeGLFunctions() #else // GLES #ifdef _WIN32 - _eglGetProcAddress = reinterpret_cast(GetProcAddress(module, "eglGetProcAddress")); + _GPAeglGetProcAddress = reinterpret_cast(GetProcAddress(module, "eglGetProcAddress")); - if (nullptr == _eglGetProcAddress) + if (nullptr == _GPAeglGetProcAddress) { return GPA_STATUS_ERROR_NULL_POINTER; } @@ -286,9 +286,9 @@ GPA_Status InitializeGLFunctions() #endif #ifdef _LINUX - _eglGetProcAddress = reinterpret_cast(dlsym(module, "eglGetProcAddress")); + _GPAeglGetProcAddress = reinterpret_cast(dlsym(module, "eglGetProcAddress")); - if (nullptr == _eglGetProcAddress) + if (nullptr == _GPAeglGetProcAddress) { return GPA_STATUS_ERROR_NULL_POINTER; } From 2857acaf6d0e008e00dc0454ea0d84cd713c2b90 Mon Sep 17 00:00:00 2001 From: Mark Janes Date: Tue, 6 Mar 2018 12:13:45 -0800 Subject: [PATCH 4/7] Obtain EGL entry points from the proper library. Mesa does not provide EGL entry points in libGL. --- Src/GPUPerfAPIGL/GPUPerfAPIGL.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Src/GPUPerfAPIGL/GPUPerfAPIGL.cpp b/Src/GPUPerfAPIGL/GPUPerfAPIGL.cpp index 64dd72d6..5277d8a8 100644 --- a/Src/GPUPerfAPIGL/GPUPerfAPIGL.cpp +++ b/Src/GPUPerfAPIGL/GPUPerfAPIGL.cpp @@ -241,10 +241,11 @@ GPA_Status InitializeGLFunctions() #ifdef _WIN32 HMODULE module = LoadLibraryA("opengl32.dll"); #else - void* module = dlopen("libGL.so", RTLD_LAZY); + void* egl_module = dlopen("libEGL.so", RTLD_LAZY); + void* gl_module = dlopen("libGL.so", RTLD_LAZY); #endif - if (nullptr == module) + if ((nullptr == egl_module) || (nullptr == gl_module)) { return GPA_STATUS_ERROR_NULL_POINTER; } @@ -264,7 +265,7 @@ GPA_Status InitializeGLFunctions() #endif #ifdef _LINUX - _GPAglXGetProcAddressARB = reinterpret_cast(dlsym(module, "glXGetProcAddressARB")); + _GPAglXGetProcAddressARB = reinterpret_cast(dlsym(egl_module, "glXGetProcAddressARB")); if (nullptr == _GPAglXGetProcAddressARB) { @@ -286,7 +287,7 @@ GPA_Status InitializeGLFunctions() #endif #ifdef _LINUX - _GPAeglGetProcAddress = reinterpret_cast(dlsym(module, "eglGetProcAddress")); + _GPAeglGetProcAddress = reinterpret_cast(dlsym(egl_module, "eglGetProcAddress")); if (nullptr == _GPAeglGetProcAddress) { @@ -303,9 +304,9 @@ GPA_Status InitializeGLFunctions() _oglGetIntegerv = reinterpret_cast(GetProcAddress(module, "glGetIntegerv")); #endif #ifdef _LINUX - _oglFlush = reinterpret_cast(dlsym(module, "glFlush")); - _oglGetString = reinterpret_cast(dlsym(module, "glGetString")); - _oglGetIntegerv = reinterpret_cast(dlsym(module, "glGetIntegerv")); + _oglFlush = reinterpret_cast(dlsym(gl_module, "glFlush")); + _oglGetString = reinterpret_cast(dlsym(gl_module, "glGetString")); + _oglGetIntegerv = reinterpret_cast(dlsym(gl_module, "glGetIntegerv")); #endif if (nullptr == _oglFlush || nullptr == _oglGetString || nullptr == _oglGetIntegerv) From 6b9ae79869201e5c303231ba678e502571f624e5 Mon Sep 17 00:00:00 2001 From: Mark Janes Date: Tue, 6 Mar 2018 12:37:46 -0800 Subject: [PATCH 5/7] Compare substring of device name Mesa appends kernel version and other information to the reported device name. --- Src/GPUPerfAPI-Common/GPAHWInfo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/GPUPerfAPI-Common/GPAHWInfo.cpp b/Src/GPUPerfAPI-Common/GPAHWInfo.cpp index 215a4537..6c2abb0f 100644 --- a/Src/GPUPerfAPI-Common/GPAHWInfo.cpp +++ b/Src/GPUPerfAPI-Common/GPAHWInfo.cpp @@ -175,7 +175,7 @@ bool GPA_HWInfo::UpdateRevisionIdBasedOnDeviceIDAndName() { string thisMarketingName(it->m_szMarketingName); - if (thisMarketingName.compare(m_deviceName) == 0) + if (m_deviceName.find(thisMarketingName) != std::string::npos) { SetRevisionID(static_cast(it->m_revID)); return true; From 72c0e60519c370d0209351c77aa72852fd51199e Mon Sep 17 00:00:00 2001 From: Mark Janes Date: Tue, 6 Mar 2018 12:35:07 -0800 Subject: [PATCH 6/7] Drop assertion on num counters check Mesa does not provide the expected number of counters. --- Src/GPUPerfAPIGL/GPUPerfAPIGL.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/GPUPerfAPIGL/GPUPerfAPIGL.cpp b/Src/GPUPerfAPIGL/GPUPerfAPIGL.cpp index 5277d8a8..f90d3c58 100644 --- a/Src/GPUPerfAPIGL/GPUPerfAPIGL.cpp +++ b/Src/GPUPerfAPIGL/GPUPerfAPIGL.cpp @@ -1033,7 +1033,7 @@ GPA_Status GPA_IMP_OpenContext(void* pContext) // There will be no catastrophic errors if the GPA expects less counters than GL exposes, but we may not have the right counters... and may be reporting bad results. // There could be major issues if the GPA expects more counters than GL exposes, because we may try to enable a counter that doesn't exist, // in which case we hope the driver will return a 0 result and not write unexpected values into the register. - assert(pHardwareCounters->m_pGroups[g].m_numCounters == (unsigned int)nCounters); + // assert(pHardwareCounters->m_pGroups[g].m_numCounters >= (unsigned int)nCounters); if (pHardwareCounters->m_pGroups[g].m_numCounters != (unsigned int)nCounters) { From 9fe7a3b8c5cd176c78669c582c870d4fd9370b93 Mon Sep 17 00:00:00 2001 From: Mark Janes Date: Tue, 6 Mar 2018 12:14:02 -0800 Subject: [PATCH 7/7] Drop ext from entry points The EXT functions are part of the GL spec, and are not exposed as extensions by Mesa. --- Src/GPUPerfAPIGL/GPUPerfAPIGL.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Src/GPUPerfAPIGL/GPUPerfAPIGL.cpp b/Src/GPUPerfAPIGL/GPUPerfAPIGL.cpp index f90d3c58..600332c6 100644 --- a/Src/GPUPerfAPIGL/GPUPerfAPIGL.cpp +++ b/Src/GPUPerfAPIGL/GPUPerfAPIGL.cpp @@ -500,14 +500,14 @@ GPA_Status InitializeGLFunctions() GET_PROC_ADDRESS(_oglDeleteQueries, PFNGLDELETEQUERIESPROC, "glDeleteQueries"); GET_PROC_ADDRESS(_oglQueryCounter, PFNGLQUERYCOUNTERPROC, "glQueryCounter"); #else - GET_PROC_ADDRESS(_oglBeginQuery, PFNGLBEGINQUERYPROC, "glBeginQueryEXT"); - GET_PROC_ADDRESS(_oglEndQuery, PFNGLENDQUERYPROC, "glEndQueryEXT"); - GET_PROC_ADDRESS(_oglGetQueryiv, PFNGLGETQUERYIVPROC, "glGetQueryivEXT"); + GET_PROC_ADDRESS(_oglBeginQuery, PFNGLBEGINQUERYPROC, "glBeginQuery"); + GET_PROC_ADDRESS(_oglEndQuery, PFNGLENDQUERYPROC, "glEndQuery"); + GET_PROC_ADDRESS(_oglGetQueryiv, PFNGLGETQUERYIVPROC, "glGetQueryiv"); GET_PROC_ADDRESS(_oglGetQueryObjectui64vEXT, PFNGLGETQUERYOBJECTUI64VEXTPROC, "glGetQueryObjectui64vEXT"); - GET_PROC_ADDRESS(_oglGetQueryObjectiv, PFNGLGETQUERYOBJECTIVPROC, "glGetQueryObjectivEXT"); - GET_PROC_ADDRESS(_oglGenQueries, PFNGLGENQUERIESPROC, "glGenQueriesEXT"); - GET_PROC_ADDRESS(_oglDeleteQueries, PFNGLDELETEQUERIESPROC, "glDeleteQueriesEXT"); - GET_PROC_ADDRESS(_oglQueryCounter, PFNGLQUERYCOUNTEREXTPROC, "glQueryCounterEXT"); + GET_PROC_ADDRESS(_oglGetQueryObjectiv, PFNGLGETQUERYOBJECTIVPROC, "glGetQueryObjectiv"); + GET_PROC_ADDRESS(_oglGenQueries, PFNGLGENQUERIESPROC, "glGenQueries"); + GET_PROC_ADDRESS(_oglDeleteQueries, PFNGLDELETEQUERIESPROC, "glDeleteQueries"); + GET_PROC_ADDRESS(_oglQueryCounter, PFNGLQUERYCOUNTERPROC, "glQueryCounter"); #ifndef GL_TIMESTAMP #define GL_TIMESTAMP GL_TIMESTAMP_EXT