cpu: add force cpu flags

Use PIPEWIRE_CPU to force cpu flags.
This commit is contained in:
Wim Taymans 2019-01-07 15:02:18 +01:00
parent 1ca7704d64
commit 9573b24e52
3 changed files with 23 additions and 0 deletions

View file

@ -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))

View file

@ -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);

View file

@ -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);
} }