From 511e7265cc9b2c41de0b36e336fb5bced6327683 Mon Sep 17 00:00:00 2001 From: Grazvydas Ignotas Date: Thu, 3 Jul 2014 02:55:47 +0300 Subject: [PATCH] openal-soft: use NEON for float conversion on output --- .../openal-soft/neon_write_converter.patch | 83 +++++++++++++++++++ recipes/openal/openal-soft_1.15.1.bb | 3 +- 2 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 recipes/openal/openal-soft/neon_write_converter.patch diff --git a/recipes/openal/openal-soft/neon_write_converter.patch b/recipes/openal/openal-soft/neon_write_converter.patch new file mode 100644 index 0000000..76865a4 --- /dev/null +++ b/recipes/openal/openal-soft/neon_write_converter.patch @@ -0,0 +1,83 @@ +diff -ur openal-soft-1.15.1.orig/Alc/ALu.c openal-soft-1.15.1/Alc/ALu.c +--- openal-soft-1.15.1.orig/Alc/ALu.c 2014-07-02 03:36:17.874323362 +0300 ++++ openal-soft-1.15.1/Alc/ALu.c 2014-07-03 02:41:18.000116397 +0300 +@@ -956,11 +956,78 @@ + return SamplesToDo*numchans*sizeof(T); \ + } + ++static int Write_ALshort(ALCdevice *device, ALshort *RESTRICT buffer, ALuint SamplesToDo) ++{ ++ ALfloat (*RESTRICT DryBuffer)[BUFFERSIZE] = device->DryBuffer; ++ ALuint numchans = ChannelsFromDevFmt(device->FmtChans); ++ const ALuint *offsets = device->ChannelOffsets; ++ ALuint i, j; ++ ++#ifdef __ARM_NEON__ ++ if (numchans == 2 && offsets[0] == 0 && offsets[1] == 1) ++ { ++ ALfloat *cl = DryBuffer[0]; ++ ALfloat *cr = DryBuffer[1]; ++ ALuint samples = SamplesToDo; ++ asm volatile ( ++ "movw r3, #0x0000fe00\n" ++ "movt r3, #0x46ff\n" ++ "vdup.32 d4, r3 @ 32767.0\n" ++ "0:\n" ++ "vld1.32 {q0}, [%1, :128]!\n" ++ "vld1.32 {q1}, [%2, :128]!\n" ++ "subs %3, #4\n" ++ "vmul.f32 q0, d4[0]\n" ++ "vmul.f32 q1, d4[0]\n" ++ "vcvt.s32.f32 q0, q0\n" ++ "vcvt.s32.f32 q1, q1\n" ++ "pld [%1, #64*2]\n" ++ "pld [%2, #64*2]\n" ++ "vqmovn.s32 d0, q0\n" ++ "vqmovn.s32 d1, q1\n" ++ "blt 1f\n" ++ "vst2.16 {d0,d1}, [%0]!\n" ++ "bgt 0b\n" ++ "nop\n" ++ "b 2f\n" /* eq 4 - all done */ ++ "1:\n" ++ "vzip.16 q0, q0\n" ++ "add %3, #4\n" ++ "vst1.32 {d0[0]}, [%0]!\n" ++ "cmp %3, #1\n" ++ "ble 2f\n" ++ "vst1.32 {d0[1]}, [%0]!\n" ++ "cmp %3, #2\n" ++ "ble 2f\n" ++ "vst1.32 {d1[0]}, [%0]!\n" ++ "2:\n" ++ : "=&r"(buffer), "=&r"(cl), "=&r"(cr), "=&r"(samples) ++ : "0"(buffer), "1"(cl), "2"(cr), "3"(samples) ++ : "r3", "q0", "q1", "d4", "cc", "memory" ++ ); ++ return SamplesToDo * numchans * sizeof(ALshort); ++ } ++#endif ++ ++ for(j = 0;j < MaxChannels;j++) ++ { ++ ALshort *RESTRICT out; ++ ++ if(offsets[j] == INVALID_OFFSET) ++ continue; ++ ++ out = buffer + offsets[j]; ++ for(i = 0;i < SamplesToDo;i++) ++ out[i * numchans] = aluF2S(DryBuffer[j][i]); ++ } ++ return SamplesToDo * numchans * sizeof(ALshort); ++} ++ + DECL_TEMPLATE(ALfloat, aluF2F) + DECL_TEMPLATE(ALuint, aluF2UI) + DECL_TEMPLATE(ALint, aluF2I) + DECL_TEMPLATE(ALushort, aluF2US) +-DECL_TEMPLATE(ALshort, aluF2S) ++//DECL_TEMPLATE(ALshort, aluF2S) + DECL_TEMPLATE(ALubyte, aluF2UB) + DECL_TEMPLATE(ALbyte, aluF2B) + diff --git a/recipes/openal/openal-soft_1.15.1.bb b/recipes/openal/openal-soft_1.15.1.bb index 077a258..5f4f69a 100644 --- a/recipes/openal/openal-soft_1.15.1.bb +++ b/recipes/openal/openal-soft_1.15.1.bb @@ -3,7 +3,7 @@ HOMEPAGE = "http://kcat.strangesoft.net/openal.html" LICENSE = "GPLv2" LIC_FILES_CHKSUM = "file://COPYING;md5=facc3a8f452930083bbb95d82b989c35" -PR = "r1" +PR = "r2" inherit cmake @@ -14,6 +14,7 @@ DEPENDS = "${@base_contains('DISTRO_FEATURES', 'alsa', 'alsa-lib', '', d)} \ SRC_URI = " \ http://kcat.strangesoft.net/openal-releases/${PN}-${PV}.tar.bz2 \ file://default_to_short.patch;patch=1 \ + file://neon_write_converter.patch;patch=1 \ " SRC_URI[md5sum] = "ea83dec3b9655a27d28e7bc7cae9cd71" -- 2.39.2