summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIan Romanick <[email protected]>2004-10-13 19:56:15 +0000
committerIan Romanick <[email protected]>2004-10-13 19:56:15 +0000
commit447cdd536fe4539b724e8a7024659e3f4cd724d1 (patch)
treeba64cf7c4d3b15dd52fef34f68a38b8057d988af
parentb72ed81818e63a70c1ded2789b9e22ee4c516aae (diff)
Initial support for PowerPC specific code in Mesa and DRI drivers. DRI
drivers built on PowerPC systems should now show things like "PowerPC" or "PowerPC/Altivec" in the GL_RENDERER string. The VMX moniker is used for Altivec/Velocity Engine/VMX SIMD additions. I chose this not because I work for IBM but because it's a LOT shorter to type. :)
-rw-r--r--Makefile1
-rw-r--r--configs/linux-dri-ppc17
-rw-r--r--src/mesa/drivers/dri/common/utils.c30
-rw-r--r--src/mesa/math/m_xform.c9
-rw-r--r--src/mesa/ppc/common_ppc.c88
-rw-r--r--src/mesa/ppc/common_ppc_features.h51
-rw-r--r--src/mesa/sources3
7 files changed, 193 insertions, 6 deletions
diff --git a/Makefile b/Makefile
index e683669e4e5..864ee980b77 100644
--- a/Makefile
+++ b/Makefile
@@ -75,6 +75,7 @@ linux-debug \
linux-dri \
linux-dri-x86 \
linux-dri-x86-64 \
+linux-dri-ppc \
linux-glide \
linux-icc \
linux-icc-static \
diff --git a/configs/linux-dri-ppc b/configs/linux-dri-ppc
new file mode 100644
index 00000000000..5b80feb71fb
--- /dev/null
+++ b/configs/linux-dri-ppc
@@ -0,0 +1,17 @@
+# -*-makefile-*-
+# Configuration for linux-dri: Linux DRI hardware drivers for XFree86 & others
+
+include $(TOP)/configs/linux-dri
+
+CONFIG_NAME = linux-dri-ppc
+
+OPT_FLAGS = -Os -mcpu=603
+PIC_FLAGS = -fPIC
+
+ASM_FLAGS = -DUSE_PPC_ASM -DUSE_VMX_ASM
+ASM_SOURCES = $(PPC_SOURCES)
+
+# Build only the drivers for cards that exist on PowerPC. At some point MGA
+# will be added, but not yet.
+DRI_DIRS = dri_client mach64 r128 r200 radeon tdfx
+
diff --git a/src/mesa/drivers/dri/common/utils.c b/src/mesa/drivers/dri/common/utils.c
index 59401073ece..0e8e54a2028 100644
--- a/src/mesa/drivers/dri/common/utils.c
+++ b/src/mesa/drivers/dri/common/utils.c
@@ -20,11 +20,14 @@
* 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.
+ */
+
+/**
+ * \file utils.c
+ * Utility functions for DRI drivers.
*
- * Authors:
- * Ian Romanick <[email protected]>
+ * \author Ian Romanick <[email protected]>
*/
-/* $XFree86:$ */
#include <string.h>
#include <stdlib.h>
@@ -40,6 +43,10 @@
#include "x86/common_x86_asm.h"
#endif
+#if defined(USE_PPC_ASM)
+#include "ppc/common_ppc_features.h"
+#endif
+
unsigned
driParseDebugString( const char * debug,
const struct dri_debug_control * control )
@@ -141,6 +148,23 @@ driGetRendererString( char * buffer, const char * hardware_name,
cpu[0] = " SPARC";
next = 1;
+#elif defined(USE_PPC_ASM)
+ if ( _mesa_ppc_cpu_features ) {
+ cpu[next] = (cpu_has_64) ? " PowerPC 64" : " PowerPC";
+ next++;
+ }
+
+# ifdef USE_VMX_ASM
+ if ( cpu_has_vmx ) {
+ cpu[next] = "/Altivec";
+ next++;
+ }
+# endif
+
+ if ( ! cpu_has_fpu ) {
+ cpu[next] = "/No FPU";
+ next++;
+ }
#endif
for ( i = 0 ; i < next ; i++ ) {
diff --git a/src/mesa/math/m_xform.c b/src/mesa/math/m_xform.c
index c1d543b07e8..66dc44d9541 100644
--- a/src/mesa/math/m_xform.c
+++ b/src/mesa/math/m_xform.c
@@ -55,6 +55,10 @@
#include "sparc/sparc.h"
#endif
+#ifdef USE_PPC_ASM
+#include "ppc/common_ppc_features.h"
+#endif
+
clip_func _mesa_clip_tab[5];
clip_func _mesa_clip_np_tab[5];
dotprod_func _mesa_dotprod_tab[5];
@@ -204,9 +208,10 @@ _math_init_transformation( void )
#ifdef USE_X86_ASM
_mesa_init_all_x86_transform_asm();
-#endif
-#ifdef USE_SPARC_ASM
+#elif defined( USE_SPARC_ASM )
_mesa_init_all_sparc_transform_asm();
+#elif defined( USE_PPC_ASM )
+ _mesa_init_all_ppc_transform_asm();
#endif
}
diff --git a/src/mesa/ppc/common_ppc.c b/src/mesa/ppc/common_ppc.c
new file mode 100644
index 00000000000..13526df78c9
--- /dev/null
+++ b/src/mesa/ppc/common_ppc.c
@@ -0,0 +1,88 @@
+/*
+ * (C) Copyright IBM Corporation 2004
+ * All Rights Reserved.
+ *
+ * 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
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, 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 NON-INFRINGEMENT. IN NO EVENT SHALL
+ * IBM AND/OR THEIR SUPPLIERS 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.
+ */
+
+/**
+ * \file common_ppc.c
+ * Check CPU capabilities & initialize optimized funtions for this particular
+ * processor.
+ *
+ * \author Ian Romanick <[email protected]>
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+#ifdef USE_PPC_ASM
+#include <elf.h>
+#endif
+
+unsigned long _mesa_ppc_cpu_features = 0;
+
+/**
+ * Detect CPU features and install optimized transform and lighting routines.
+ * Currently, CPU features are only detected. The optimized routines have
+ * yet to be written.
+ *
+ * \bug
+ * This routine is highly specific to Linux kernel 2.6. I'm still waiting
+ * to hear back from the glibc folk on how to do this "right".
+ */
+
+void _mesa_init_all_ppc_transform_asm( void )
+{
+#ifdef USE_PPC_ASM
+ const pid_t my_pid = getpid();
+ char file_name[32];
+ FILE * f;
+#ifdef __powerpc64__
+ Elf64_auxv_t v;
+#else
+ Elf32_auxv_t v;
+#endif
+
+ sprintf( file_name, "/proc/%u/auxv", (unsigned) my_pid );
+ f = fopen( file_name, "rb" );
+ if ( f != NULL ) {
+ while( 1 ) {
+ ssize_t elem = fread( & v, sizeof( v ), 1, f );
+
+ if ( elem < 1 ) {
+ break;
+ }
+
+ if ( v.a_type == AT_HWCAP ) {
+ _mesa_ppc_cpu_features = v.a_un.a_val;
+ break;
+ }
+ }
+
+ fclose( f );
+ }
+
+# ifndef USE_VMX_ASM
+ _mesa_ppc_cpu_features &= ~PPC_FEATURES_HAS_ALTIVEC;
+# endif
+#endif
+}
diff --git a/src/mesa/ppc/common_ppc_features.h b/src/mesa/ppc/common_ppc_features.h
new file mode 100644
index 00000000000..4d46ca04c9d
--- /dev/null
+++ b/src/mesa/ppc/common_ppc_features.h
@@ -0,0 +1,51 @@
+/*
+ * (C) Copyright IBM Corporation 2004
+ * All Rights Reserved.
+ *
+ * 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
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, 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 NON-INFRINGEMENT. IN NO EVENT SHALL
+ * IBM AND/OR THEIR SUPPLIERS 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.
+ */
+
+/**
+ * \file common_ppc_features.h
+ * Interface for determining which CPU features were detected.
+ *
+ * \author Ian Romanick <[email protected]>
+ */
+
+#ifndef COMMON_PPC_FEATURES_H
+#define COMMON_PPC_FEATURES_H
+
+#ifdef USE_PPC_ASM
+#include <asm/cputable.h>
+
+extern unsigned long _mesa_ppc_cpu_features;
+
+
+/* The PPC_FEATURE_* values come from asm/cputable.h. Should we define
+ * versions of them here if that file does not exist? This will only
+ * matter once these code paths are supported on non-Linux platforms.
+ */
+
+#define cpu_has_64 ((_mesa_ppc_cpu_features & PPC_FEATURE_64) != 0)
+#define cpu_has_vmx ((_mesa_ppc_cpu_features & PPC_FEATURE_HAS_ALTIVEC) != 0)
+#define cpu_has_fpu ((_mesa_ppc_cpu_features & PPC_FEATURE_HAS_FPU) != 0)
+
+#endif /* USE_PPC_ASM */
+#endif /* COMMON_PPC_FEATURES_H */
diff --git a/src/mesa/sources b/src/mesa/sources
index 9845dc033b5..7013182f6f2 100644
--- a/src/mesa/sources
+++ b/src/mesa/sources
@@ -150,7 +150,8 @@ ASM_C_SOURCES = \
x86/x86.c \
x86/3dnow.c \
x86/sse.c \
- sparc/sparc.c
+ sparc/sparc.c \
+ ppc/common_ppc.c
X86_SOURCES = \
x86/common_x86_asm.S \