Resource (자원)

반응형

dx10에서의 자원은 버퍼텍스쳐의 두가지 타입이 있다.
msdn을 참고해 보면 아래와 같다.

ID3D10Resource Interface

A resource interface provides common actions on all resources.

IUnknown
   ID3D10DeviceChild
      ID3D10Resource

즉, 모든 자원에 대한 공통 기능은 ID3D10Resource 인터페이스로 구현된다는 것을 알 수 있다.
이 인터페이스를 상속받아구현된 인터페이스들로는 ID3DBuffer, ID3D10TextureXD, ID3D10TextureCuber가 있다.
자원은 비디오 메모리에 존재하게 된다.
자원의 생성시에는 Usage와 CPUAcessFlags를 설정할 수 있다.

Usage
CPU와 GPU가 각각 자원을 읽기와 쓰기 관점에서 어떻게 접근하는지.

CPUAccessFlags
자원에 대한 CPU의 접근 권한을 명시.

리소스를 생성하고 나서 사용하기 위해서는 뷰를 만들고 바인딩을 시켜야 한다.
모든 데이터는 각 스테이지가 적절히 해석할 수 있는 형태로 스테이지에게 제공해야 한다.
뷰가 바로 이런 일을 해주는 녀석이다.
뷰는 스테이지가 인식할 수 있도록 데이터를 포장한다.
렌더타겟뷰, 깊이스텐실뷰, 세이더 자원뷰가 이들이다.
각 뷰의 인터페이스는 아래와 같다.

render target view - ID3D10RenderTargetView              CreateRenderTargetView
depth stencil view - ID3D10DepthStencilView                CreateDepthStencilView
shader resource view - ID3D10ShaderResourceView    CreateShaderResourceView

렌더타겟뷰와 깊이스텐실뷰는 OMSetRenderTargets을 사용하여 출력병합기(om) 스테이지에 바인딩 하고
세이더 자원뷰는 (vs/gs/ps)SetShaderResources함수를 호출하여 정점세이더, 기하세이더, 픽셀세이더 스테이지에 바인딩
된다.

뷰 바인딩은 자원이 텍스쳐인 경우 사용되며 자원이 버퍼인 경우에는 다음과 같은 함수가 사용된다.
정점버퍼 바인딩       - IASetVertexBuffers
인덱스버퍼 바인딩    - IASetIndexBuffers
상수버퍼 바인딩       - SetConstantBuffers

dx10에서는 자원을 생성할 때 자원이 시스템 메모리나 비디오 메모리 등의 어떤 종류의 메모리에 존재하도록 할지를 설정하지 않는다.
단지 Usage만 지정하고 자원이 존재하는 메모리 풀은 내부적으로 장치의 메모리 관리자가 결정한다.
Usage는 자원의 생성시에 지정할 수 있다.

ex)
D3D10_TEXTURE2D_DESC tex2dDesc;
 tex2dDesc.Width    = desc_.width_;
 tex2dDesc.Height   = desc_.height_;
 tex2dDesc.MipLevels   = 1;
 tex2dDesc.ArraySize   = 1;
 tex2dDesc.Format   = deviceSetting->d3d10_.autoDepthStencilFormat_; 
 tex2dDesc.BindFlags   = D3D10_BIND_DEPTH_STENCIL;
 tex2dDesc.CPUAccessFlags = 0;
 tex2dDesc.MiscFlags   = 0;
 tex2dDesc.SampleDesc  = deviceSetting->d3d10_.sd_.SampleDesc;
 tex2dDesc.Usage    = D3D10_USAGE_DEFAULT;

자원은 CPU 또는 GPU가 접근할 수 있다.
CPU가 자원을 접근하기 위해서는 Map함수를 사용하고 GPU가 자원을 접근하기 위해서는
CopySubresourcRegion, CopyResource, UpdateSubresource함수를 사용한다.
접근은 많이 허용될수록 성능이 떨어진다는 것을 유의해야 한다.

위의 예에서는 D3D10_USAGE_DEFAULT를 지정하였다.
이 외에도 Uage에 대한 옵션을 알아보자면 아래와 같다.
D3D10_USAGE_DEFAULT : GPU가 자원의 읽기 및 쓰기를 할 수 있도록 한다.
D3D10_USAGE_IMMUTABLE : GPU의 READ ONLY, CPU는 접근불가.
D3D10_USAGE_DYNAMIC : GPU의 READ ONLY, CPU의 WRITE ONLY
                                       이 옵션은 CPU가 매 프레임을 그릴 때에 자원을 매번 수정하는 동적자원일 경우 적합.
D3D10_USAGE_STAGING : GPU의 데이터를 CPU로 보내는 경우 사용.

Usage의 지정에 있어서 고려해야 할 것은 자원이 갱신되는 정도이다.
. 생성이후 불변인 경우  - IMMUTBLE로 지정.
. 갱신 정도가 프레임당 1번 미만인 경우 - DEFAULT 지정.
. 매 프레임당 한번이상 갱신되는 경우. - DYNAMIC로 지정.
TAGS.

Comments