Skip to content

Commit 64f03f0

Browse files
committed
add loongarch64 build support
1 parent 36f74c2 commit 64f03f0

File tree

8 files changed

+106
-6
lines changed

8 files changed

+106
-6
lines changed

cmrtlib/build_linux.sh

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,11 @@ case $BUILD_SIZE in
138138
if [[ $BUILD_64 -eq 1 ]]; then
139139
CROSS_BUILD=1
140140
BUILD_SIZE=64
141-
EXTRA_OPTIONS="export CFLAGS=-m64 CXXFLAGS=-m64"
141+
if [ ${MACHINE_TYPE} == 'loongarch64' ]; then
142+
EXTRA_OPTIONS=""
143+
else
144+
EXTRA_OPTIONS="export CFLAGS=-m64 CXXFLAGS=-m64"
145+
fi
142146
fi
143147
;;
144148
64)

media_driver/agnostic/common/cm/cm_mem.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,27 +26,40 @@
2626

2727
#include "cm_mem.h"
2828
#include "cm_mem_c_impl.h"
29+
30+
#if !defined(__loongarch64)
2931
#include "cm_mem_sse2_impl.h"
32+
#endif
3033

3134
typedef void(*t_CmFastMemCopy)( void* dst, const void* src, const size_t bytes );
3235
typedef void(*t_CmFastMemCopyWC)( void* dst, const void* src, const size_t bytes );
3336

37+
#if !defined(__loongarch64)
3438
#define CM_FAST_MEM_COPY_CPU_INIT_C(func) (func ## _C)
3539
#define CM_FAST_MEM_COPY_CPU_INIT_SSE2(func) (func ## _SSE2)
3640
#define CM_FAST_MEM_COPY_CPU_INIT(func) (is_SSE2_available ? CM_FAST_MEM_COPY_CPU_INIT_SSE2(func) : CM_FAST_MEM_COPY_CPU_INIT_C(func))
41+
#endif
3742

3843
void CmFastMemCopy( void* dst, const void* src, const size_t bytes )
3944
{
45+
#if defined(__loongarch64)
46+
CmFastMemCopy_C(dst, src, bytes);
47+
#else
4048
static const bool is_SSE2_available = (GetCpuInstructionLevel() >= CPU_INSTRUCTION_LEVEL_SSE2);
4149
static const t_CmFastMemCopy CmFastMemCopy_impl = CM_FAST_MEM_COPY_CPU_INIT(CmFastMemCopy);
4250

4351
CmFastMemCopy_impl(dst, src, bytes);
52+
#endif
4453
}
4554

4655
void CmFastMemCopyWC( void* dst, const void* src, const size_t bytes )
4756
{
57+
#if defined(__loongarch64)
58+
CmFastMemCopyWC_C(dst, src, bytes);
59+
#else
4860
static const bool is_SSE2_available = (GetCpuInstructionLevel() >= CPU_INSTRUCTION_LEVEL_SSE2);
4961
static const t_CmFastMemCopyWC CmFastMemCopyWC_impl = CM_FAST_MEM_COPY_CPU_INIT(CmFastMemCopyWC);
5062

5163
CmFastMemCopyWC_impl(dst, src, bytes);
64+
#endif
5265
}

media_driver/agnostic/common/cm/cm_mem.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,15 @@
2525
//!
2626
#pragma once
2727

28+
#if defined(__loongarch64)
29+
#define SIMDE_X86_SSE2_ENABLE_NATIVE_ALIASES
30+
#include <simde/x86/sse2.h>
31+
#else
2832
#include <mmintrin.h>
2933
#include <xmmintrin.h>
3034
#include <emmintrin.h>
35+
#endif
36+
3137
#include "cm_debug.h"
3238
#include "mos_utilities.h"
3339

@@ -43,7 +49,11 @@ enum CPU_INSTRUCTION_LEVEL
4349
NUM_CPU_INSTRUCTION_LEVELS
4450
};
4551

52+
#if defined(__loongarch64)
53+
typedef __m128i DQWORD; // 128-bits, 16-bytes
54+
#else
4655
typedef __m128 DQWORD; // 128-bits, 16-bytes
56+
#endif
4757
typedef uint32_t PREFETCH[8]; // 32-bytes
4858
typedef uint32_t CACHELINE[8]; // 32-bytes
4959
typedef uint16_t DHWORD[32]; // 512-bits, 64-bytes
@@ -230,9 +240,12 @@ inline CPU_INSTRUCTION_LEVEL GetCpuInstructionLevel( void )
230240
int cpuInfo[4];
231241
memset( cpuInfo, 0, 4*sizeof(int) );
232242

243+
#if !defined(__loongarch64)
233244
GetCPUID(cpuInfo, 1);
245+
#endif
234246

235247
CPU_INSTRUCTION_LEVEL cpuInstructionLevel = CPU_INSTRUCTION_LEVEL_UNKNOWN;
248+
#if !defined(__loongarch64)
236249
if( (cpuInfo[2] & BIT(19)) && TestSSE4_1() )
237250
{
238251
cpuInstructionLevel = CPU_INSTRUCTION_LEVEL_SSE4_1;
@@ -253,6 +266,7 @@ inline CPU_INSTRUCTION_LEVEL GetCpuInstructionLevel( void )
253266
{
254267
cpuInstructionLevel = CPU_INSTRUCTION_LEVEL_MMX;
255268
}
269+
#endif
256270

257271
return cpuInstructionLevel;
258272
}

media_driver/cmake/linux/media_compile_flags_linux.cmake

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,6 @@ set(MEDIA_COMPILER_FLAGS_COMMON
5454

5555
# Enable c++14 features
5656
-std=c++14
57-
# -m32 or -m64
58-
-m${ARCH}
5957

6058
# Global defines
6159
-DLINUX=1
@@ -66,6 +64,13 @@ set(MEDIA_COMPILER_FLAGS_COMMON
6664
-g
6765
)
6866

67+
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^loongarch")
68+
list(APPEND MEDIA_COMPILER_FLAGS_COMMON "-Wno-overloaded-virtual")
69+
else()
70+
# -m32 or -m64
71+
list(APPEND MEDIA_COMPILER_FLAGS_COMMON "-m${ARCH}")
72+
endif()
73+
6974
if(MEDIA_BUILD_HARDENING)
7075
set(MEDIA_COMPILER_FLAGS_COMMON
7176
${MEDIA_COMPILER_FLAGS_COMMON}

media_driver/linux/common/cm/hal/osservice/cm_mem_os.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,27 @@
2727
#include "cm_mem.h"
2828
#include "cm_mem_os.h"
2929
#include "cm_mem_os_c_impl.h"
30+
31+
#if !defined(__loongarch64)
3032
#include "cm_mem_os_sse4_impl.h"
33+
#endif
3134

3235
typedef void(*t_CmFastMemCopyFromWC)( void* dst, const void* src, const size_t bytes );
3336

37+
#if !defined(__loongarch64)
3438
#define CM_FAST_MEM_COPY_CPU_INIT_C(func) (func ## _C)
3539
#define CM_FAST_MEM_COPY_CPU_INIT_SSE4(func) (func ## _SSE4)
3640
#define CM_FAST_MEM_COPY_CPU_INIT(func) (is_SSE4_available ? CM_FAST_MEM_COPY_CPU_INIT_SSE4(func) : CM_FAST_MEM_COPY_CPU_INIT_C(func))
41+
#endif
3742

3843
void CmFastMemCopyFromWC( void* dst, const void* src, const size_t bytes, CPU_INSTRUCTION_LEVEL cpuInstructionLevel )
3944
{
45+
#if defined(__loongarch64)
46+
CmFastMemCopyFromWC_C(dst, src, bytes);
47+
#else
4048
static const bool is_SSE4_available = (cpuInstructionLevel >= CPU_INSTRUCTION_LEVEL_SSE4_1);
4149
static const t_CmFastMemCopyFromWC CmFastMemCopyFromWC_impl = CM_FAST_MEM_COPY_CPU_INIT(CmFastMemCopyFromWC);
4250

4351
CmFastMemCopyFromWC_impl(dst, src, bytes);
52+
#endif
4453
}

media_driver/linux/common/cm/hal/osservice/cm_mem_os.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,13 @@
2626
#pragma once
2727

2828
#include <iostream>
29+
#if defined(__loongarch64)
30+
#define SIMDE_X86_SSE2_ENABLE_NATIVE_ALIASES
31+
#include <simde/x86/sse2.h>
32+
#else
2933
#include "cpuid.h"
3034
#include <smmintrin.h>
35+
#endif
3136

3237
typedef uintptr_t UINT_PTR;
3338
#define __fastcall
@@ -120,6 +125,9 @@ Inline Function:
120125
\*****************************************************************************/
121126
inline void GetCPUID(int cpuInfo[4], int infoType)
122127
{
128+
#if defined(__loongarch64)
129+
return;
130+
#else
123131
#ifndef NO_EXCEPTION_HANDLING
124132
__try
125133
{
@@ -135,6 +143,7 @@ inline void GetCPUID(int cpuInfo[4], int infoType)
135143
return;
136144
}
137145
#endif //NO_EXCEPTION_HANDLING
146+
#endif //defined(__loongarch64)
138147
}
139148

140149
void CmFastMemCopyFromWC( void* dst, const void* src, const size_t bytes, CPU_INSTRUCTION_LEVEL cpuInstructionLevel );

media_driver/media_top_cmake.cmake

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,20 @@ if(NOT DEFINED SKIP_GMM_CHECK)
4646
endif()
4747
endif(NOT DEFINED SKIP_GMM_CHECK)
4848

49+
if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^loongarch")
50+
find_path(SIMDE_INCLUDE_DIR
51+
NAMES simde/simde-common.h # A key SIMDE header
52+
PATHS /usr/include /usr/local/include # Default paths
53+
DOC "Path to SIMDE headers"
54+
)
55+
if(SIMDE_INCLUDE_DIR)
56+
include_directories(${SIMDE_INCLUDE_DIR})
57+
message(STATUS "Found SIMDE: ${SIMDE_INCLUDE_DIR}")
58+
else()
59+
message(FATAL_ERROR "SIMDE not found. Install it or set SIMDE_INCLUDE_DIR manually.")
60+
endif()
61+
endif()
62+
4963
message("-- media -- PLATFORM = ${PLATFORM}")
5064
message("-- media -- ARCH = ${ARCH}")
5165
message("-- media -- CMAKE_CURRENT_LIST_DIR = ${CMAKE_CURRENT_LIST_DIR}")
@@ -248,8 +262,11 @@ set_source_files_properties(${CP_COMMON_SHARED_SOURCES_} PROPERTIES LANGUAGE "CX
248262
set_source_files_properties(${CP_COMMON_NEXT_SOURCES_} PROPERTIES LANGUAGE "CXX")
249263
set_source_files_properties(${CP_SOURCES_} PROPERTIES LANGUAGE "CXX")
250264
set_source_files_properties(${SOFTLET_DDI_SOURCES_} PROPERTIES LANGUAGE "CXX")
265+
266+
if(NOT ${CMAKE_SYSTEM_PROCESSOR} MATCHES "^loongarch")
251267
set_source_files_properties(${SOURCES_SSE2} PROPERTIES LANGUAGE "CXX")
252268
set_source_files_properties(${SOURCES_SSE4} PROPERTIES LANGUAGE "CXX")
269+
endif()
253270

254271
# MHW settings
255272
set(SOFTLET_MHW_PRIVATE_INCLUDE_DIRS_
@@ -421,13 +438,15 @@ set (VP_PRIVATE_INCLUDE_DIRS_
421438
${VP_PRIVATE_INCLUDE_DIRS_}
422439
${SOFTLET_VP_PRIVATE_INCLUDE_DIRS_})
423440

441+
if(NOT ${CMAKE_SYSTEM_PROCESSOR} MATCHES "^loongarch")
424442
add_library(${LIB_NAME}_SSE2 OBJECT ${SOURCES_SSE2})
425443
target_compile_options(${LIB_NAME}_SSE2 PRIVATE -msse2)
426444
target_include_directories(${LIB_NAME}_SSE2 BEFORE PRIVATE ${SOFTLET_MOS_PREPEND_INCLUDE_DIRS_} ${MOS_PUBLIC_INCLUDE_DIRS_} ${SOFTLET_MOS_PUBLIC_INCLUDE_DIRS_} ${COMMON_PRIVATE_INCLUDE_DIRS_} ${SOFTLET_MHW_PRIVATE_INCLUDE_DIRS_} ${SOFTLET_DDI_PUBLIC_INCLUDE_DIRS_})
427445

428446
add_library(${LIB_NAME}_SSE4 OBJECT ${SOURCES_SSE4})
429447
target_compile_options(${LIB_NAME}_SSE4 PRIVATE -msse4.1)
430448
target_include_directories(${LIB_NAME}_SSE4 BEFORE PRIVATE ${SOFTLET_MOS_PREPEND_INCLUDE_DIRS_} ${MOS_PUBLIC_INCLUDE_DIRS_} ${SOFTLET_MOS_PUBLIC_INCLUDE_DIRS_} ${COMMON_PRIVATE_INCLUDE_DIRS_} ${SOFTLET_MHW_PRIVATE_INCLUDE_DIRS_} ${SOFTLET_DDI_PUBLIC_INCLUDE_DIRS_})
449+
endif()
431450

432451
add_library(${LIB_NAME}_COMMON OBJECT ${COMMON_SOURCES_} ${SOFTLET_DDI_SOURCES_})
433452
set_property(TARGET ${LIB_NAME}_COMMON PROPERTY POSITION_INDEPENDENT_CODE 1)
@@ -603,6 +622,17 @@ target_include_directories(${LIB_NAME}_mos_softlet BEFORE PRIVATE
603622
############## MOS LIB END ########################################
604623

605624
############## Media Driver Static and Shared Lib #################
625+
if( ${CMAKE_SYSTEM_PROCESSOR} MATCHES "^loongarch")
626+
add_library(${LIB_NAME} SHARED
627+
$<TARGET_OBJECTS:${LIB_NAME}_mos>
628+
$<TARGET_OBJECTS:${LIB_NAME}_COMMON>
629+
$<TARGET_OBJECTS:${LIB_NAME}_CODEC>
630+
$<TARGET_OBJECTS:${LIB_NAME}_VP>
631+
$<TARGET_OBJECTS:${LIB_NAME}_CP>
632+
$<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_VP>
633+
$<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_CODEC>
634+
$<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_COMMON>)
635+
else()
606636
add_library(${LIB_NAME} SHARED
607637
$<TARGET_OBJECTS:${LIB_NAME}_mos>
608638
$<TARGET_OBJECTS:${LIB_NAME}_COMMON>
@@ -614,8 +644,20 @@ add_library(${LIB_NAME} SHARED
614644
$<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_VP>
615645
$<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_CODEC>
616646
$<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_COMMON>)
647+
endif()
617648

618649

650+
if( ${CMAKE_SYSTEM_PROCESSOR} MATCHES "^loongarch")
651+
add_library(${LIB_NAME_STATIC} STATIC
652+
$<TARGET_OBJECTS:${LIB_NAME}_mos>
653+
$<TARGET_OBJECTS:${LIB_NAME}_COMMON>
654+
$<TARGET_OBJECTS:${LIB_NAME}_CODEC>
655+
$<TARGET_OBJECTS:${LIB_NAME}_VP>
656+
$<TARGET_OBJECTS:${LIB_NAME}_CP>
657+
$<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_VP>
658+
$<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_CODEC>
659+
$<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_COMMON>)
660+
else()
619661
add_library(${LIB_NAME_STATIC} STATIC
620662
$<TARGET_OBJECTS:${LIB_NAME}_mos>
621663
$<TARGET_OBJECTS:${LIB_NAME}_COMMON>
@@ -627,6 +669,7 @@ add_library(${LIB_NAME_STATIC} STATIC
627669
$<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_VP>
628670
$<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_CODEC>
629671
$<TARGET_OBJECTS:${LIB_NAME}_SOFTLET_COMMON>)
672+
endif()
630673

631674
set_target_properties(${LIB_NAME_STATIC} PROPERTIES OUTPUT_NAME ${LIB_NAME})
632675

media_softlet/cmake/linux/media_compile_flags_linux.cmake

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,6 @@ set(MEDIA_COMPILER_FLAGS_COMMON
5353
-ffunction-sections
5454
-Wl,--gc-sections
5555

56-
# -m32 or -m64
57-
-m${ARCH}
58-
5956
# Global defines
6057
-DLINUX=1
6158
-DLINUX
@@ -65,6 +62,12 @@ set(MEDIA_COMPILER_FLAGS_COMMON
6562
-g
6663
)
6764

65+
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^loongarch")
66+
list(APPEND MEDIA_COMPILER_FLAGS_COMMON "-Wno-overloaded-virtual")
67+
else()
68+
# -m32 or -m64
69+
list(APPEND MEDIA_COMPILER_FLAGS_COMMON "-m${ARCH}")
70+
endif()
6871

6972
if(${UFO_MARCH} STREQUAL "slm")
7073
set(MEDIA_COMPILER_FLAGS_COMMON

0 commit comments

Comments
 (0)