Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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 31
Archives
Today
Total
관리 메뉴

codingfarm

4. 자원 상태 전이(Resource Transitions) - 작성중 본문

computer graphics/DX12 book

4. 자원 상태 전이(Resource Transitions) - 작성중

scarecrow1992 2021. 1. 25. 00:26

https://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

 

 

 

 

 

Comments