일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 그래프
- DP
- String
- Two Points
- MYSQL
- 스토어드 프로시저
- Trie
- Hash
- two pointer
- SQL
- 이진탐색
- 다익스트라
- binary search
- Dijkstra
- Brute Force
- union find
- Stored Procedure
Archives
- Today
- Total
codingfarm
4. 자원 상태 전이(Resource Transitions) - 작성중 본문
computer graphics/DX12 book
4. 자원 상태 전이(Resource Transitions) - 작성중
scarecrow1992 2021. 1. 25. 00:26https://ssinyoung.tistory.com/40
자원 상태 전이
자원 위험 상황(resource hazard)
- GPU가 자원에 자료를 다 기록하지 않거나 기록을 시작하지 않은 상태에서 자원의 자료를 읽으려 하는 상황
- ex) 한 단계에서 GPU가 자원 $R$에 data를 기록하고, 이후의 한 단계에서 그 자원 $R$의 자료를 읽어서 사용하려는데, 읽기전에 자원 $R$에 다른 data를 기록하려 할 경우
- 이를 해결하기 위해 Direct3D는 자원들에 상태를 부여함
- 어떤 리소스에 대해 특정 상태가 되기 전까진, 해당 리소스를 실행할 수 없게 만듬
자원 상태
- 모든 리소스는 하나의 상태(state)를 꼭 가저야 함
- 어떤 그래픽 명령이 특정 리소스를 사용해서 실행되기 위해선, 그 명령에 필요한 상태로 리소스가 설정되어야 함
- 기본적으로 read, write 두개중 하나의 상태를 가진다 생각하면 됨
- 자원은 생성과 동시에 기본 상태(default state)로 시작함
- 전이 지원 장벽(trasition resource barrier)들의 배열을 설정해서 지정
- 배열이기에 한번의 API 호출로 여러개의 자원을 전이 가능
- 자원 장벽은 D3D12_RESOURCE_BARRIER 구조체로 서술됨
- resource barrier에 대해 서술하는 구조체
- stateBefore 상태의 특정 리소스를 stateAfter 상태로 전환하는 정보를 담음
- ResourceBarrier 함수로 GPU에게 자원의 상태가 전이 됨을 알린다
참고 : 자원 상태 전이에 관한 장벽 이외의 자원 장벽들도 있지만, 지금은 전이용 장벽만 알아두자. 다른 종류의 장벽들은 관련 주제가 나올때 다룰것
자원 상태 관리
- 자원 상태의 관리는 응용 프로그램의 몫임
- ex1) 텍스처 자원에 자료를 기록해야한다 = 텍스처의 상태를 render target state로 변경(전이)
- ex2) 텍스처의 자료를 읽어야 한다 = 텍스처의 상태를 shader resource state로 변경(전이)
- 응용 프로그램은 상태 전이를 Direct3D에게 보고(notify)함
- Direct3D는 자원 상태 전이를 보고 받고 그저 상황에 맞추어 필요한 자원들을 가저다 쓸뿐임
- GPU가 아니라 프로그램에게 상태 전이를 맡김으로써 성능에 이득을 봄
- 전이를 GPU가 자동으로 추적하게 하면 성능에 부담이 발생
사용 예
D3D12_RESOURCE_BARRIER
1
2
3
4
5
6
7
8
9
|
typedef struct D3D12_RESOURCE_BARRIER {
D3D12_RESOURCE_BARRIER_TYPE Type;
D3D12_RESOURCE_BARRIER_FLAGS Flags;
union {
D3D12_RESOURCE_TRANSITION_BARRIER Transition;
D3D12_RESOURCE_ALIASING_BARRIER Aliasing;
D3D12_RESOURCE_UAV_BARRIER UAV;
};
} D3D12_RESOURCE_BARRIER;
|
cs |
매개변수 | 기능 |
Type | resource barrier의 타입을 결정할 열거형 필드 |
Flags | |
D3D12_RESOURCE_BARRIER를 손쉽게 쓰기위한 확장형 구조체인 CD3DX12_RESOURCE_BARRIER이 존재함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
struct CD3DX12_RESOURCE_BARRIER : public D3D12_RESOURCE_BARRIER {
// 편의용 메서드들
static inline CD3DX12_RESOURCE_BARRIER Transition(
_In_ ID3D12Resource* pResource,
D3D12_RESOURCE_STATES stateBefore,
D3D12_RESOURCE_STATES stateAfter,
UINT subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES,
D3D12_RESOURCE_BARRIER_FLAGS flags = D3D12_RESOURCE_BARRIER_FLAG_NONE)
{
CD3DX12_RESOURCE_BARRIER result;
ZeroMemory(&result, sizeof(result));
D3D12_RESOURCE_BARRIER &barrier = result;
result.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
result.Flags = flags;
barrier.Transition.pResource = pResource;
barrier.Transition.StateBefore = stateBefore;
barrier.Transition.StateAfter = stateAfter;
barrier.Transition.Subresource = subresource;
return result;
}
// 편의용 메서드들
};
|
cs |
ResourceBarrier
1
2
3
4
|
void ResourceBarrier(
UINT NumBarriers,
const D3D12_RESOURCE_BARRIER *pBarriers
);
|
cs |
resource로의 다중 접근에 대한 동기화가 필요함을 드라이버에게 알리는 함수
사용 예
1
2
3
4
5
|
mCommandList->ResourceBarrier(
1, &CD3DX12_RESOURCE_BARRIER::Transition(
CurrentBackBuffer(),
D3D12_RESOURCE_STATE_PRESENT,
D3D12_RESOURCE_STATE_RENDER_TARGET));
|
cs |
'computer graphics > DX12 book' 카테고리의 다른 글
4. Direct3D의 초기화 (0) | 2021.01.25 |
---|---|
4. 명령 목록을 이용한 다중 스레드 활용 (0) | 2021.01.25 |
4. CPU와 GPU의 상호작용(Command List, Queue, Allocator) (1) | 2021.01.14 |
4. 기능 수준(feature level) (0) | 2021.01.11 |
4. 다중표본화(multisampling) (0) | 2021.01.11 |
Comments