mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	cpu: add force cpu flags
Use PIPEWIRE_CPU to force cpu flags.
This commit is contained in:
		
							parent
							
								
									1ca7704d64
								
							
						
					
					
						commit
						9573b24e52
					
				
					 3 changed files with 23 additions and 0 deletions
				
			
		| 
						 | 
					@ -66,6 +66,7 @@ extern "C" {
 | 
				
			||||||
#define SPA_CPU_FLAG_NEON	(1 << 5)
 | 
					#define SPA_CPU_FLAG_NEON	(1 << 5)
 | 
				
			||||||
#define SPA_CPU_FLAG_ARMV8	(1 << 6)
 | 
					#define SPA_CPU_FLAG_ARMV8	(1 << 6)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SPA_CPU_FORCE_AUTODETECT	((uint32_t)-1)
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * The CPU features interface
 | 
					 * The CPU features interface
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					@ -82,6 +83,9 @@ struct spa_cpu {
 | 
				
			||||||
	/** get CPU flags */
 | 
						/** get CPU flags */
 | 
				
			||||||
	uint32_t (*get_flags) (struct spa_cpu *cpu);
 | 
						uint32_t (*get_flags) (struct spa_cpu *cpu);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/** force CPU flags, use SPA_CPU_FORCE_AUTODETECT to autodetect CPU flags */
 | 
				
			||||||
 | 
						int (*force_flags) (struct spa_cpu *cpu, uint32_t flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/** get number of CPU cores */
 | 
						/** get number of CPU cores */
 | 
				
			||||||
	uint32_t (*get_count) (struct spa_cpu *cpu);
 | 
						uint32_t (*get_count) (struct spa_cpu *cpu);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -90,6 +94,7 @@ struct spa_cpu {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define spa_cpu_get_flags(c)		(c)->get_flags((c))
 | 
					#define spa_cpu_get_flags(c)		(c)->get_flags((c))
 | 
				
			||||||
 | 
					#define spa_cpu_force_flags(c,f)	(c)->force_flags((c), (f))
 | 
				
			||||||
#define spa_cpu_get_count(c)		(c)->get_count((c))
 | 
					#define spa_cpu_get_count(c)		(c)->get_count((c))
 | 
				
			||||||
#define spa_cpu_get_max_align(c)	(c)->get_max_align((c))
 | 
					#define spa_cpu_get_max_align(c)	(c)->get_max_align((c))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,6 +45,7 @@ struct impl {
 | 
				
			||||||
	struct spa_log *log;
 | 
						struct spa_log *log;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uint32_t flags;
 | 
						uint32_t flags;
 | 
				
			||||||
 | 
						uint32_t force;
 | 
				
			||||||
	uint32_t count;
 | 
						uint32_t count;
 | 
				
			||||||
	uint32_t max_align;
 | 
						uint32_t max_align;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -58,9 +59,19 @@ static uint32_t
 | 
				
			||||||
impl_cpu_get_flags(struct spa_cpu *cpu)
 | 
					impl_cpu_get_flags(struct spa_cpu *cpu)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct impl *impl = SPA_CONTAINER_OF(cpu, struct impl, cpu);
 | 
						struct impl *impl = SPA_CONTAINER_OF(cpu, struct impl, cpu);
 | 
				
			||||||
 | 
						if (impl->force != SPA_CPU_FORCE_AUTODETECT)
 | 
				
			||||||
 | 
							return impl->force;
 | 
				
			||||||
	return impl->flags;
 | 
						return impl->flags;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int
 | 
				
			||||||
 | 
					impl_cpu_force_flags(struct spa_cpu *cpu, uint32_t flags)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct impl *impl = SPA_CONTAINER_OF(cpu, struct impl, cpu);
 | 
				
			||||||
 | 
						impl->force = flags;
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static uint32_t get_count(struct impl *this)
 | 
					static uint32_t get_count(struct impl *this)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	cpu_set_t cpuset;
 | 
						cpu_set_t cpuset;
 | 
				
			||||||
| 
						 | 
					@ -88,6 +99,7 @@ static const struct spa_cpu impl_cpu = {
 | 
				
			||||||
	SPA_VERSION_CPU,
 | 
						SPA_VERSION_CPU,
 | 
				
			||||||
	NULL,
 | 
						NULL,
 | 
				
			||||||
	impl_cpu_get_flags,
 | 
						impl_cpu_get_flags,
 | 
				
			||||||
 | 
						impl_cpu_force_flags,
 | 
				
			||||||
	impl_cpu_get_count,
 | 
						impl_cpu_get_count,
 | 
				
			||||||
	impl_cpu_get_max_align,
 | 
						impl_cpu_get_max_align,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -146,6 +158,7 @@ impl_init(const struct spa_handle_factory *factory,
 | 
				
			||||||
			this->log = support[i].data;
 | 
								this->log = support[i].data;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	this->flags = 0;
 | 
						this->flags = 0;
 | 
				
			||||||
 | 
						this->force = SPA_CPU_FORCE_AUTODETECT;
 | 
				
			||||||
	this->max_align = 16;
 | 
						this->max_align = 16;
 | 
				
			||||||
	this->count = get_count(this);
 | 
						this->count = get_count(this);
 | 
				
			||||||
	init(this);
 | 
						init(this);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,6 +35,7 @@
 | 
				
			||||||
#include <dlfcn.h>
 | 
					#include <dlfcn.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/support/dbus.h>
 | 
					#include <spa/support/dbus.h>
 | 
				
			||||||
 | 
					#include <spa/support/cpu.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "pipewire.h"
 | 
					#include "pipewire.h"
 | 
				
			||||||
#include "private.h"
 | 
					#include "private.h"
 | 
				
			||||||
| 
						 | 
					@ -445,6 +446,10 @@ void pw_init(int *argc, char **argv[])
 | 
				
			||||||
	iface = load_interface(plugin, "cpu", SPA_TYPE_INTERFACE_CPU, &info,
 | 
						iface = load_interface(plugin, "cpu", SPA_TYPE_INTERFACE_CPU, &info,
 | 
				
			||||||
			support->n_support, support->support);
 | 
								support->n_support, support->support);
 | 
				
			||||||
	if (iface != NULL) {
 | 
						if (iface != NULL) {
 | 
				
			||||||
 | 
							struct spa_cpu *cpu = iface->iface;
 | 
				
			||||||
 | 
							if ((str = getenv("PIPEWIRE_CPU")))
 | 
				
			||||||
 | 
								spa_cpu_force_flags(cpu, strtoul(str, NULL, 0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		support->support[support->n_support++] =
 | 
							support->support[support->n_support++] =
 | 
				
			||||||
			SPA_SUPPORT_INIT(SPA_TYPE_INTERFACE_CPU, iface->iface);
 | 
								SPA_SUPPORT_INIT(SPA_TYPE_INTERFACE_CPU, iface->iface);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue