※ XMVECTOR 매개변수 전달.
▶ XMVECTOR 인스턴스를 인수로 해서 함수를 호출 할 때, 효율성을 위해서 XMVECTOR 값이 스택이 아니라 SSE/SSE2 레지스터를 통해서 함수에 전달되게 해야 한다. 그런 식으로 전달할 수 있는 인수의 개수는 플랫폼(32 비트 Windows , 64비트 Windows , Windows RT등)과 컴파일러에 따라 다르다.
그래서 플랫폼/컴파일러에 대한 의존성을 없애기 위해서 XMVECTOR 매개변수에 대해 FXMVECTOR, GXMVECTOR, HXMVECTOR, CXMVECTOR라는 형식들을 사용해야 한다. 또한 , SSE/SSE2 레지스터 활용을 위한 호출 규약 역시 컴파일러에 따라 다를 수 있는데, 그러한 의존성을 없애려면 함수 이름 앞에 반드시 XM_CALLCONV라는 호출 규약 지시자를 붙여야 한다.
# XMVECTOR 매개변수의 전달에 관란 규칙을 요약하자면 다음과 같다.
1. 처음 세 XMVECTOR 매개변수에는 반드시 FXMVECTOR 형식을 지정해야 된다.
2. 넷째 XMVECTOR 매개변수에는 반드시 GXMVECTOR 형식을 지정해야 한다.
3. 다섯째와 여섯째 XMVECTOR 매개변수에는 반드시 HXMVECTOR 형식을 지정해야 한다.
3. 그 이상의 XMVECTOR 매개변수들에는 반드시 CXMVECTOR형식을 지정해야 된다.
▶ 예를들어, 32 비트 Windows에서 __fastcall 호출 규약을 지원하는 컴파일러와 좀 더 최신의 __vectorcall 호출 규약을 지원하는 컴파일러는 이 형식들을 다음과 같이 정의한다.
// 32 -bit Window __fastcall은 처음 세 XMVECTOR 인수를
// 레지스터들을 통해서 전달하고 , 나머지는 스택을 사용한다.
typedef const XMVECTOR FXMVECTOR;
typedef const XMVECTOR& GXMVECTOR;
typedef const XMVECTOR& HXMVECTOR;
typedef const XMVECTOR& CXMVECTOR;
// 32 -bit Window __vectorcall은 처음 여섯 XMVECTOR 인수를
// 레지스터들을 통해서 전달하고, 나머지는 스택을 사용한다.
typedef const XMVECTOR FXMVECTOR;
typedef const XMVECTOR GXMVECTOR;
typedef const XMVECTOR HXMVECTOR;
typedef const XMVECTOR& CXMVECTOR;
# 사용한 예시
▶ XMVECVOR 매개변수 중간에 XMVECTOR 매개변수가 아니여도 규칙은 똑같이 적용한다.
# 사용한 예시
▶ 생성자에 대해서는 조금 다른 규칙이 있다.
1. 처음 세 XMVECTOR 매개변수에는 FXMVECTOR 형식을 지정해야 된다.
2. 그 나머지에는 CXMVECTOR를 사용을 권한다.
3. 생성자에는 XM_CALLCONV를 사용하지 말아야 된다.
# 사용한 예시
- 지금까지 말한 XMVECTOR 매개변수 전달 규칙은 '입력' 매개변수들에 적용된다. '출력' XMVECTOR 매개변수(XMVECTOR& 또는 XMVECTOR*)는 SSE/SSE2 레지스터를 사용하지 않으므로, 그냥 XMVECTOR가 아닌 매개변수들과 동일하게 취급된다.
'Directx12 > DirectX 내용' 카테고리의 다른 글
DirectXMath 라이브러리의 벡터(3) (0) | 2022.08.15 |
---|---|
DirectXMath 라이브러리의 벡터(1) (0) | 2022.08.02 |