sna: Detect available instruction sets at runtime

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2013-02-25 23:13:23 +00:00
parent 56fd91fc83
commit aa045d80ec
5 changed files with 94 additions and 1 deletions

View File

@ -48,6 +48,7 @@ libsna_la_SOURCES = \
sna_accel.c \
sna_blt.c \
sna_composite.c \
sna_cpu.c \
sna_damage.c \
sna_damage.h \
sna_display.c \

View File

@ -207,6 +207,18 @@ struct sna {
#define SNA_TEAR_FREE 0x10
#define SNA_FORCE_SHADOW 0x20
unsigned cpu_features;
#define MMX 0x1
#define SSE 0x2
#define SSE2 0x4
#define SSE3 0x8
#define SSSE3 0x10
#define SSE4a 0x20
#define SSE4_1 0x40
#define SSE4_2 0x80
#define AVX 0x100
#define AVX2 0x200
unsigned watch_flush;
struct timeval timer_tv;
@ -855,6 +867,8 @@ inline static bool is_clipped(const RegionRec *r,
r->extents.y2 - r->extents.y1 != d->height);
}
unsigned sna_cpu_detect(void);
void sna_threads_init(void);
int sna_use_threads (int width, int height, int threshold);
void sna_threads_run(void (*func)(void *arg), void *arg);

View File

@ -1371,7 +1371,7 @@ static bool
sna_pixmap_create_mappable_gpu(PixmapPtr pixmap)
{
struct sna *sna = to_sna_from_pixmap(pixmap);
struct sna_pixmap *priv = sna_pixmap(pixmap);;
struct sna_pixmap *priv = sna_pixmap(pixmap);
unsigned create;
if (wedged(sna))

76
src/sna/sna_cpu.c Normal file
View File

@ -0,0 +1,76 @@
/*
* Copyright (c) 2013 Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* Authors:
* Chris Wilson <chris@chris-wilson.co.uk>
*
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "sna.h"
#include <cpuid.h>
unsigned sna_cpu_detect(void)
{
unsigned int eax, ebx, ecx, edx;
unsigned features = 0;
__cpuid(0, eax, ebx, ecx, edx);
if (eax & bit_SSE3)
features |= SSE3;
if (eax & bit_SSSE3)
features |= SSSE3;
if (eax & bit_SSE4_1)
features |= SSE4_1;
if (eax & bit_SSE4_2)
features |= SSE4_2;
if (eax & bit_AVX)
features |= AVX;
if (edx & bit_MMX)
features |= MMX;
if (edx & bit_SSE)
features |= SSE;
if (edx & bit_SSE2)
features |= SSE2;
if (edx & bit_SSE4a)
features |= SSE4a;
__cpuid(7, eax, ebx, ecx, edx);
if (eax & bit_AVX2)
features |= AVX2;
return features;
}

View File

@ -487,6 +487,8 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
sna->info = (void *)((uintptr_t)scrn->driverPrivate & ~1);
scrn->driverPrivate = sna;
sna->cpu_features = sna_cpu_detect();
}
sna = to_sna(scrn);
sna->scrn = scrn;