Module: Mesa
Branch: master
Commit: 67f27b1e18d8e68c795f2eb43c06abfe4b6fcaca
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=67f27b1e18d8e68c795f2eb43c06abfe4b6fcaca
Author: Apple SWE
Date: Tue Mar 13 18:24:26 2018 -0700
Add processor topology calculation implementation for Darwin/OSX targets.
The implementation for bootstrapping SWR on Darwin targets is based on the
Linux version.
Instead of reading the output of /proc/cpuinfo, sysctlbyname is used to
determine the
physical identifiers, processor identifiers, core counts and thread-processor
affinities.
With this patch, it is possible to use SWR as an alternate renderer on OSX to
softpipe and
llvmpipe.
Reviewed-by: Jeremy Huddleston Sequoia
Reviewed-by: Bruce Cherniak
---
.../drivers/swr/rasterizer/core/threads.cpp| 56 +-
1 file changed, 55 insertions(+), 1 deletion(-)
diff --git a/src/gallium/drivers/swr/rasterizer/core/threads.cpp
b/src/gallium/drivers/swr/rasterizer/core/threads.cpp
index 4d79168d2d..3eb20abcbf 100644
--- a/src/gallium/drivers/swr/rasterizer/core/threads.cpp
+++ b/src/gallium/drivers/swr/rasterizer/core/threads.cpp
@@ -36,6 +36,11 @@
#include
#endif
+#ifdef __APPLE__
+#include
+#include
+#endif
+
#include "common/os.h"
#include "context.h"
#include "frontend.h"
@@ -219,6 +224,56 @@ void CalculateProcessorTopology(CPUNumaNodes& out_nodes,
uint32_t& out_numThread
#elif defined(__APPLE__)
+auto numProcessors = 0;
+auto numCores = 0;
+auto numPhysicalIds = 0;
+
+int value;
+size_t size = sizeof(value);
+
+int result = sysctlbyname("hw.packages", &value, &size, NULL, 0);
+SWR_ASSERT(result == 0);
+numPhysicalIds = value;
+
+result = sysctlbyname("hw.logicalcpu", &value, &size, NULL, 0);
+SWR_ASSERT(result == 0);
+numProcessors = value;
+
+result = sysctlbyname("hw.physicalcpu", &value, &size, NULL, 0);
+SWR_ASSERT(result == 0);
+numCores = value;
+
+out_nodes.resize(numPhysicalIds);
+
+for (auto physId = 0; physId < numPhysicalIds; ++physId)
+{
+auto &numaNode = out_nodes[physId];
+auto procId = 0;
+
+numaNode.cores.resize(numCores);
+
+while (procId < numProcessors)
+{
+for (auto coreId = 0; coreId < numaNode.cores.size(); ++coreId,
++procId)
+{
+auto &core = numaNode.cores[coreId];
+
+core.procGroup = coreId;
+core.threadIds.push_back(procId);
+}
+}
+}
+
+out_numThreadsPerProcGroup = 0;
+
+for (auto &node : out_nodes)
+{
+for (auto &core : node.cores)
+{
+out_numThreadsPerProcGroup += core.threadIds.size();
+}
+}
+
#else
#error Unsupported platform
@@ -253,7 +308,6 @@ void CalculateProcessorTopology(CPUNumaNodes& out_nodes,
uint32_t& out_numThread
}
}
-
void bindThread(SWR_CONTEXT* pContext, uint32_t threadId, uint32_t procGroupId
= 0, bool bindProcGroup=false)
{
// Only bind threads when MAX_WORKER_THREADS isn't set.
___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-commit