From 6911e7a873ea11a19e11cb71ed0f7c57bff46c57 Mon Sep 17 00:00:00 2001 From: Beherith Date: Thu, 19 Dec 2024 17:16:42 +0100 Subject: [PATCH 1/3] objectlabel and debug groups --- rts/Lua/LuaOpenGL.cpp | 157 +++++++++++++++++++++++++++++++++ rts/Lua/LuaOpenGL.h | 4 + rts/lib/headlessStubs/glstub.c | 4 + 3 files changed, 165 insertions(+) diff --git a/rts/Lua/LuaOpenGL.cpp b/rts/Lua/LuaOpenGL.cpp index b5dd9c979c..b1e3f2c54b 100644 --- a/rts/Lua/LuaOpenGL.cpp +++ b/rts/Lua/LuaOpenGL.cpp @@ -5661,5 +5661,162 @@ int LuaOpenGL::GetMapRendering(lua_State* L) return 0; } + + +/* +void glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +Parameters + + identifier: + Specifies the type of object being labeled. Possible values include: + GL_BUFFER: Buffer object. + GL_SHADER: Shader object. + GL_PROGRAM: Program object. + GL_VERTEX_ARRAY: Vertex array object (VAO). + GL_QUERY: Query object. + GL_PROGRAM_PIPELINE: Program pipeline object. + GL_TRANSFORM_FEEDBACK: Transform feedback object. + GL_TEXTURE: Texture object. + GL_RENDERBUFFER: Renderbuffer object. + GL_FRAMEBUFFER: Framebuffer object. + + name: + Specifies the name or ID of the object to label (e.g., the result of glGenBuffers, glCreateShader, etc.). + + length: + Specifies the length of the label string. If -1, the function treats the string as null-terminated. + + label: + A null-terminated string containing the label to be assigned to the object. + +Notes + + Length Handling: + If you provide -1 as the length, OpenGL assumes the label is null-terminated. + Otherwise, you must specify the exact length of the label string. + + Debugging Tools: + The label appears in OpenGL debug outputs and tools like RenderDoc, Nsight, or apitrace. + This makes it easier to trace operations and diagnose issues related to specific OpenGL objects. + + Portability: + Supported in OpenGL 4.3 and later. + Also available with the KHR_debug extension in earlier versions of OpenGL (if supported). + */ +// Ensure that identifier is a valid GLenum +// The length should be passed as -1 because the strings are null terminated +// Check that the GLuint name refers to a valid openGL object +// Check that the label is a valid string +// Write a a docstring as well as a comment +// Write a lua interface for this function: +// void glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label); + +/** + * @function gl.ObjectLabel + * @param identifier GLenum Specifies the type of object being labeled. + * @param name GLuint Specifies the name or ID of the object to label. + * @param label string A null-terminated string containing the label to be assigned to the object. + * @treturn nil + */ +int LuaOpenGL::ObjectLabel(lua_State* L) { + GLenum identifier = (GLenum)luaL_checkinteger(L, 1); + GLuint name = (GLuint)luaL_checkinteger(L, 2); + const char* label = luaL_checkstring(L, 3); + + // Ensure that identifier is a valid GLenum + // The length should be passed as -1 because the strings are null terminated + // Check that the GLuint name refers to a valid openGL object + // Check that the label is a valid string + glObjectLabel(identifier, name, -1, label); + + return 0; +} + +/* + +`glPushDebugGroup` is a function in the OpenGL API that helps developers debug and profile OpenGL applications. It is part of the `KHR_debug` extension, which is integrated into the core OpenGL since version 4.3. + +### Purpose +`glPushDebugGroup` allows you to group a set of OpenGL commands into a named debug group. This helps in identifying and organizing sections of code in the debug output, making it easier to diagnose and analyze rendering issues. + +### Function Prototype +```c +void glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message); +``` + +### Parameters +1. **`source`**: Specifies the source of the debug group. Common values include: + - `GL_DEBUG_SOURCE_APPLICATION`: Indicates that the debug group is defined by the application. + - `GL_DEBUG_SOURCE_THIRD_PARTY`: Indicates that the group is defined by external tools or libraries. + +2. **`id`**: A numeric identifier for the group. This can be any value that uniquely identifies the group within the scope of the source. + +3. **`length`**: The length of the `message` string. If this is `-1`, the string is assumed to be null-terminated. + +4. **`message`**: A human-readable string describing the debug group. This message is used in debugging tools or logs. + +### Example Usage +```c +glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 1, -1, "Render Scene"); + +// OpenGL commands for rendering the scene +glDrawArrays(GL_TRIANGLES, 0, 36); +glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); + +glPopDebugGroup(); // End of the debug group +``` + +### Notes +- Each `glPushDebugGroup` must be matched with a corresponding `glPopDebugGroup`. +- The function adds a new debug group to the debug output stack. Groups can be nested for better organization. +- Debug groups are particularly useful when analyzing rendering performance or diagnosing errors in tools like OpenGL Debug Output or profilers. + +### Benefits +1. **Organized Debugging**: Clearly marks and groups commands for easier traceability. +2. **Better Profiling**: Tools can provide insights into specific debug groups. +3. **Improved Diagnostics**: Helps isolate and identify problematic sections of code. + +### Availability +- OpenGL 4.3 or later. +- Requires the `KHR_debug` extension in earlier versions of OpenGL (if supported). + +By using `glPushDebugGroup`, you can make debugging and profiling OpenGL applications much more structured and efficient. + +Write the lua interfaces for glPushDebugGroup and glPopDebugGroup + */ + +// Ensure that identifier is a valid GLenum +// The length should be passed as -1 because the strings are null terminated +// Check that the GLuint name refers to a valid openGL object +// Check that the label is a valid string +// Write a a docstring as well as a comment +// Write a lua interface for this function: + +/** + * @function gl.PushDebugGroup + * @param source GLenum Specifies the source of the debug group. + * @param id GLuint A numeric identifier for the group. + * @param message string A human-readable string describing the debug group. + * @treturn nil + */ +int LuaOpenGL::PushDebugGroup(lua_State* L) { + GLenum source = (GLenum)luaL_checkinteger(L, 1); + GLuint id = (GLuint)luaL_checkinteger(L, 2); + const char* message = luaL_checkstring(L, 3); + + glPushDebugGroup(source, id, -1, message); + + return 0; +} + +/** + * @function gl.PopDebugGroup + * @treturn nil + */ +int LuaOpenGL::PopDebugGroup(lua_State* L) { + glPopDebugGroup(); + return 0; +} + /******************************************************************************/ /******************************************************************************/ diff --git a/rts/Lua/LuaOpenGL.h b/rts/Lua/LuaOpenGL.h index 8a9630f84c..5bd03a0f69 100644 --- a/rts/Lua/LuaOpenGL.h +++ b/rts/Lua/LuaOpenGL.h @@ -353,6 +353,10 @@ class LuaOpenGL { static int GetSun(lua_State* L); static int GetWaterRendering(lua_State* L); static int GetMapRendering(lua_State* L); + + static int ObjectLabel(lua_State* L); + static int PushDebugGroup(lua_State* L); + static int PopDebugGroup(lua_State* L); }; inline void LuaOpenGL::InitMatrixState(lua_State* L, const char* fn) { diff --git a/rts/lib/headlessStubs/glstub.c b/rts/lib/headlessStubs/glstub.c index e1e3820264..b7b716b297 100644 --- a/rts/lib/headlessStubs/glstub.c +++ b/rts/lib/headlessStubs/glstub.c @@ -605,6 +605,10 @@ GLAPI void APIENTRY glDepthRange(GLdouble nearVal, GLdouble farVal) {} GLAPI void APIENTRY glBeginConditionalRender(GLuint id, GLenum mode) {} GLAPI void APIENTRY glEndConditionalRender(void) {} +GLAPI void APIENTRY glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label) {} +GLAPI void APIENTRY glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message) {} +GLAPI void APIENTRY glPopDebugGroup() {} + #ifdef __cplusplus } // extern "C" #endif From 154082728d9c2c25a0f549544023a586419ca3ef Mon Sep 17 00:00:00 2001 From: Beherith Date: Thu, 19 Dec 2024 17:17:40 +0100 Subject: [PATCH 2/3] marginally better error handling --- rts/Lua/LuaOpenGL.cpp | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/rts/Lua/LuaOpenGL.cpp b/rts/Lua/LuaOpenGL.cpp index b1e3f2c54b..f352e12967 100644 --- a/rts/Lua/LuaOpenGL.cpp +++ b/rts/Lua/LuaOpenGL.cpp @@ -5791,7 +5791,7 @@ Write the lua interfaces for glPushDebugGroup and glPopDebugGroup // Check that the label is a valid string // Write a a docstring as well as a comment // Write a lua interface for this function: - +// https://registry.khronos.org/OpenGL-Refpages/gl4/html/glPushDebugGroup.xhtml /** * @function gl.PushDebugGroup * @param source GLenum Specifies the source of the debug group. @@ -5800,13 +5800,26 @@ Write the lua interfaces for glPushDebugGroup and glPopDebugGroup * @treturn nil */ int LuaOpenGL::PushDebugGroup(lua_State* L) { - GLenum source = (GLenum)luaL_checkinteger(L, 1); - GLuint id = (GLuint)luaL_checkinteger(L, 2); - const char* message = luaL_checkstring(L, 3); + GLenum source = (GLenum)luaL_checkinteger(L, 1); + GLuint id = (GLuint)luaL_checkinteger(L, 2); + const char* message = luaL_checkstring(L, 3); - glPushDebugGroup(source, id, -1, message); + if (source != GL_DEBUG_SOURCE_APPLICATION && source != GL_DEBUG_SOURCE_THIRD_PARTY) { + luaL_error(L, "Invalid source value for gl.PushDebugGroup"); + return 0; + } - return 0; + GLint maxLength; + glGetIntegerv(GL_MAX_DEBUG_MESSAGE_LENGTH, &maxLength); + + if (strlen(message) >= maxLength) { + luaL_error(L, "Message length exceeds GL_MAX_DEBUG_MESSAGE_LENGTH"); + return 0; + } + + glPushDebugGroup(source, id, -1, message); + + return 0; } /** From 8bd8e301eac68155e21a83c571ad5ff5b998ea70 Mon Sep 17 00:00:00 2001 From: Beherith Date: Sat, 21 Dec 2024 21:43:34 +0100 Subject: [PATCH 3/3] Clean up docs, allow getting shader object ID and buffer object ID --- rts/Lua/LuaConstPlatform.cpp | 1 + rts/Lua/LuaOpenGL.cpp | 147 +++++------------------------- rts/Lua/LuaShaders.cpp | 4 +- rts/Lua/LuaVBO.cpp | 3 +- rts/Lua/LuaVBOImpl.cpp | 11 +++ rts/Lua/LuaVBOImpl.h | 2 + rts/System/Platform/CpuID.cpp | 1 + rts/System/Platform/CpuID.h | 4 + rts/System/Platform/Threading.cpp | 4 + rts/System/Platform/Threading.h | 2 + 10 files changed, 53 insertions(+), 126 deletions(-) diff --git a/rts/Lua/LuaConstPlatform.cpp b/rts/Lua/LuaConstPlatform.cpp index 7f897c0c68..445901c2a3 100644 --- a/rts/Lua/LuaConstPlatform.cpp +++ b/rts/Lua/LuaConstPlatform.cpp @@ -109,6 +109,7 @@ bool LuaConstPlatform::PushEntries(lua_State* L) LuaPushNamedString(L, "hwConfig", Platform::GetHardwareStr()); LuaPushNamedNumber(L, "cpuLogicalCores", Threading::GetLogicalCpuCores()); LuaPushNamedNumber(L, "cpuPhysicalCores", Threading::GetPhysicalCpuCores()); + LuaPushNamedString(L, "cpuBrand", Threading::GetCPUBrand()); LuaPushNamedString(L, "sysInfoHash", Platform::GetSysInfoHash()); LuaPushNamedString(L, "macAddrHash", Platform::GetMacAddrHash()); diff --git a/rts/Lua/LuaOpenGL.cpp b/rts/Lua/LuaOpenGL.cpp index f352e12967..86ea89453c 100644 --- a/rts/Lua/LuaOpenGL.cpp +++ b/rts/Lua/LuaOpenGL.cpp @@ -471,6 +471,11 @@ bool LuaOpenGL::PushEntries(lua_State* L) REGISTER_LUA_CFUNC(GetWaterRendering); REGISTER_LUA_CFUNC(GetMapRendering); + + REGISTER_LUA_CFUNC(ObjectLabel); + REGISTER_LUA_CFUNC(PushDebugGroup); + REGISTER_LUA_CFUNC(PopDebugGroup); + if (canUseShaders) LuaShaders::PushEntries(L); @@ -5662,152 +5667,46 @@ int LuaOpenGL::GetMapRendering(lua_State* L) } - -/* -void glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label); -Parameters - - identifier: - Specifies the type of object being labeled. Possible values include: - GL_BUFFER: Buffer object. - GL_SHADER: Shader object. - GL_PROGRAM: Program object. - GL_VERTEX_ARRAY: Vertex array object (VAO). - GL_QUERY: Query object. - GL_PROGRAM_PIPELINE: Program pipeline object. - GL_TRANSFORM_FEEDBACK: Transform feedback object. - GL_TEXTURE: Texture object. - GL_RENDERBUFFER: Renderbuffer object. - GL_FRAMEBUFFER: Framebuffer object. - - name: - Specifies the name or ID of the object to label (e.g., the result of glGenBuffers, glCreateShader, etc.). - - length: - Specifies the length of the label string. If -1, the function treats the string as null-terminated. - - label: - A null-terminated string containing the label to be assigned to the object. - -Notes - - Length Handling: - If you provide -1 as the length, OpenGL assumes the label is null-terminated. - Otherwise, you must specify the exact length of the label string. - - Debugging Tools: - The label appears in OpenGL debug outputs and tools like RenderDoc, Nsight, or apitrace. - This makes it easier to trace operations and diagnose issues related to specific OpenGL objects. - - Portability: - Supported in OpenGL 4.3 and later. - Also available with the KHR_debug extension in earlier versions of OpenGL (if supported). - */ -// Ensure that identifier is a valid GLenum -// The length should be passed as -1 because the strings are null terminated -// Check that the GLuint name refers to a valid openGL object -// Check that the label is a valid string -// Write a a docstring as well as a comment -// Write a lua interface for this function: -// void glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label); - /** - * @function gl.ObjectLabel - * @param identifier GLenum Specifies the type of object being labeled. - * @param name GLuint Specifies the name or ID of the object to label. + * @function gl.ObjectLabel labels an object for use with debugging tools + * @param objectTypeIdentifier GLenum Specifies the type of object being labeled. + * @param objectID GLuint Specifies the name or ID of the object to label. * @param label string A null-terminated string containing the label to be assigned to the object. * @treturn nil */ int LuaOpenGL::ObjectLabel(lua_State* L) { - GLenum identifier = (GLenum)luaL_checkinteger(L, 1); - GLuint name = (GLuint)luaL_checkinteger(L, 2); + GLenum identifier = (GLenum)luaL_checkinteger(L, 1); + if (identifier != GL_BUFFER && identifier != GL_SHADER && identifier != GL_PROGRAM && + identifier != GL_VERTEX_ARRAY && identifier != GL_QUERY && identifier != GL_PROGRAM_PIPELINE && + identifier != GL_TRANSFORM_FEEDBACK && identifier != GL_TEXTURE && identifier != GL_RENDERBUFFER && + identifier != GL_FRAMEBUFFER) { + return 0; + } + GLuint objectID = (GLuint)luaL_checkinteger(L, 2); const char* label = luaL_checkstring(L, 3); // Ensure that identifier is a valid GLenum // The length should be passed as -1 because the strings are null terminated // Check that the GLuint name refers to a valid openGL object // Check that the label is a valid string - glObjectLabel(identifier, name, -1, label); + glObjectLabel(identifier, objectID, -1, label); return 0; } -/* - -`glPushDebugGroup` is a function in the OpenGL API that helps developers debug and profile OpenGL applications. It is part of the `KHR_debug` extension, which is integrated into the core OpenGL since version 4.3. - -### Purpose -`glPushDebugGroup` allows you to group a set of OpenGL commands into a named debug group. This helps in identifying and organizing sections of code in the debug output, making it easier to diagnose and analyze rendering issues. - -### Function Prototype -```c -void glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message); -``` - -### Parameters -1. **`source`**: Specifies the source of the debug group. Common values include: - - `GL_DEBUG_SOURCE_APPLICATION`: Indicates that the debug group is defined by the application. - - `GL_DEBUG_SOURCE_THIRD_PARTY`: Indicates that the group is defined by external tools or libraries. - -2. **`id`**: A numeric identifier for the group. This can be any value that uniquely identifies the group within the scope of the source. - -3. **`length`**: The length of the `message` string. If this is `-1`, the string is assumed to be null-terminated. -4. **`message`**: A human-readable string describing the debug group. This message is used in debugging tools or logs. - -### Example Usage -```c -glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 1, -1, "Render Scene"); - -// OpenGL commands for rendering the scene -glDrawArrays(GL_TRIANGLES, 0, 36); -glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); - -glPopDebugGroup(); // End of the debug group -``` - -### Notes -- Each `glPushDebugGroup` must be matched with a corresponding `glPopDebugGroup`. -- The function adds a new debug group to the debug output stack. Groups can be nested for better organization. -- Debug groups are particularly useful when analyzing rendering performance or diagnosing errors in tools like OpenGL Debug Output or profilers. - -### Benefits -1. **Organized Debugging**: Clearly marks and groups commands for easier traceability. -2. **Better Profiling**: Tools can provide insights into specific debug groups. -3. **Improved Diagnostics**: Helps isolate and identify problematic sections of code. - -### Availability -- OpenGL 4.3 or later. -- Requires the `KHR_debug` extension in earlier versions of OpenGL (if supported). - -By using `glPushDebugGroup`, you can make debugging and profiling OpenGL applications much more structured and efficient. - -Write the lua interfaces for glPushDebugGroup and glPopDebugGroup - */ - -// Ensure that identifier is a valid GLenum -// The length should be passed as -1 because the strings are null terminated -// Check that the GLuint name refers to a valid openGL object -// Check that the label is a valid string -// Write a a docstring as well as a comment -// Write a lua interface for this function: // https://registry.khronos.org/OpenGL-Refpages/gl4/html/glPushDebugGroup.xhtml /** - * @function gl.PushDebugGroup - * @param source GLenum Specifies the source of the debug group. + * @function gl.PushDebugGroup pushes a debug marker for nVidia nSight 2024.04, does not seem to work when FBO's are raw bound * @param id GLuint A numeric identifier for the group. * @param message string A human-readable string describing the debug group. + * @param source boolean true for GL_DEBUG_SOURCE_APPLICATION, false for GL_DEBUG_SOURCE_THIRD_PARTY. default false * @treturn nil */ int LuaOpenGL::PushDebugGroup(lua_State* L) { - GLenum source = (GLenum)luaL_checkinteger(L, 1); - GLuint id = (GLuint)luaL_checkinteger(L, 2); - const char* message = luaL_checkstring(L, 3); - - if (source != GL_DEBUG_SOURCE_APPLICATION && source != GL_DEBUG_SOURCE_THIRD_PARTY) { - luaL_error(L, "Invalid source value for gl.PushDebugGroup"); - return 0; - } + GLuint id = (GLuint)luaL_checkinteger(L, 1); + const char* message = luaL_checkstring(L, 2); + bool source = luaL_optboolean(L, 3, false); GLint maxLength; glGetIntegerv(GL_MAX_DEBUG_MESSAGE_LENGTH, &maxLength); @@ -5817,7 +5716,7 @@ int LuaOpenGL::PushDebugGroup(lua_State* L) { return 0; } - glPushDebugGroup(source, id, -1, message); + glPushDebugGroup((source ? GL_DEBUG_SOURCE_APPLICATION: GL_DEBUG_SOURCE_THIRD_PARTY) , id, -1, message); return 0; } diff --git a/rts/Lua/LuaShaders.cpp b/rts/Lua/LuaShaders.cpp index b0b17a5d7b..0308e39c85 100644 --- a/rts/Lua/LuaShaders.cpp +++ b/rts/Lua/LuaShaders.cpp @@ -555,6 +555,7 @@ GLint LuaShaders::GetUniformLocation(LuaShaders::Program* p, const char* name) * @function gl.CreateShader ( table shaderParams ) * @tparam table shaderParams * @treturn number shaderID + * @treturn number glProgID * * ({[ vertex = "glsl code" ,] * [ tcs = "glsl code" ,] @@ -738,7 +739,8 @@ int LuaShaders::CreateShader(lua_State* L) // note: index, not raw ID lua_pushnumber(L, shaders.AddProgram(p)); - return 1; + lua_pushnumber(L, (int) prog); + return 2; } diff --git a/rts/Lua/LuaVBO.cpp b/rts/Lua/LuaVBO.cpp index 5e21066f35..3bd3d4a179 100644 --- a/rts/Lua/LuaVBO.cpp +++ b/rts/Lua/LuaVBO.cpp @@ -64,7 +64,8 @@ bool LuaVBOs::PushEntries(lua_State* L) "UnbindBufferRange", &LuaVBOImpl::UnbindBufferRange, "DumpDefinition", &LuaVBOImpl::DumpDefinition, - "GetBufferSize", &LuaVBOImpl::GetBufferSize + "GetBufferSize", &LuaVBOImpl::GetBufferSize, + "GetID", &LuaVBOImpl::GetID ); gl.set("VBO", sol::lua_nil); // don't want this to be accessible directly without gl.GetVBO diff --git a/rts/Lua/LuaVBOImpl.cpp b/rts/Lua/LuaVBOImpl.cpp index 8f13e3148c..90f0507017 100644 --- a/rts/Lua/LuaVBOImpl.cpp +++ b/rts/Lua/LuaVBOImpl.cpp @@ -1445,6 +1445,17 @@ void LuaVBOImpl::DumpDefinition() LOG("%s", ss.str().c_str()); } +/*** Gets the OpenGL Buffer ID + * + * @function VBO:GetID + * @treturn number buffer ID + */ +uint32_t LuaVBOImpl::GetID() +{ + VBOExistenceCheck(vbo, __func__); + return vbo->GetId(); +} + void LuaVBOImpl::AllocGLBuffer(size_t byteSize) { if (defTarget == GL_UNIFORM_BUFFER && bufferSizeInBytes > UBO_SAFE_SIZE_BYTES) { diff --git a/rts/Lua/LuaVBOImpl.h b/rts/Lua/LuaVBOImpl.h index 8c6ca3d996..e5654415b3 100644 --- a/rts/Lua/LuaVBOImpl.h +++ b/rts/Lua/LuaVBOImpl.h @@ -52,6 +52,8 @@ class LuaVBOImpl { int UnbindBufferRange(const GLuint index, const sol::optional elemOffsetOpt, const sol::optional elemCountOpt, const sol::optional targetOpt); void DumpDefinition(); + uint32_t GetID(); + public: static bool Supported(GLenum target); private: diff --git a/rts/System/Platform/CpuID.cpp b/rts/System/Platform/CpuID.cpp index 02898409e0..5bb68fdc9e 100644 --- a/rts/System/Platform/CpuID.cpp +++ b/rts/System/Platform/CpuID.cpp @@ -150,6 +150,7 @@ namespace springproc { for (int group = 0; group < system.num_cpu_types; ++group) { cpu_id_t cpu_id = system.cpu_types[group]; + cpuid_brand = std::string(cpu_id.brand_str); switch(cpu_id.purpose) { case PURPOSE_GENERAL: case PURPOSE_PERFORMANCE: diff --git a/rts/System/Platform/CpuID.h b/rts/System/Platform/CpuID.h index a3c7765ae5..f77ca2724d 100644 --- a/rts/System/Platform/CpuID.h +++ b/rts/System/Platform/CpuID.h @@ -10,6 +10,7 @@ #endif #include +#include namespace springproc { _noinline void ExecCPUID(unsigned int* a, unsigned int* b, unsigned int* c, unsigned int* d); @@ -44,6 +45,7 @@ namespace springproc { cores. */ int GetNumPhysicalCores() const { return numPhysicalCores; } int GetNumLogicalCores() const { return numLogicalCores; } + std::string GetCPUBrand() const { return cpuid_brand; } /** Total number of physical processor dies in the system. */ int GetTotalNumPackages() const { return totalNumPackages; } @@ -71,6 +73,8 @@ namespace springproc { uint64_t affinityMaskOfPackages[MAX_PROCESSORS]; uint64_t availableProceesorAffinityMask; + std::string cpuid_brand; + //////////////////////// // Intel specific fields diff --git a/rts/System/Platform/Threading.cpp b/rts/System/Platform/Threading.cpp index 92ccec0e8b..2da83e3614 100644 --- a/rts/System/Platform/Threading.cpp +++ b/rts/System/Platform/Threading.cpp @@ -213,6 +213,10 @@ namespace Threading { return springproc::CPUID::GetInstance().GetNumPhysicalCores(); } + std::string GetCPUBrand() { + return springproc::CPUID::GetInstance().GetCPUBrand(); + } + bool HasHyperThreading() { return (GetLogicalCpuCores() > GetPhysicalCpuCores()); } diff --git a/rts/System/Platform/Threading.h b/rts/System/Platform/Threading.h index 17ac5cab90..58de5d2c0a 100644 --- a/rts/System/Platform/Threading.h +++ b/rts/System/Platform/Threading.h @@ -124,6 +124,8 @@ namespace Threading { int GetLogicalCpuCores(); /// physical + hyperthreading bool HasHyperThreading(); + std::string GetCPUBrand(); + /** * Inform the OS kernel that we are a cpu-intensive task */