가속화된 상태 관리

가속화된 상태 관리는 단일 호출에서 API 및 DDI에서 큰 상태 변경 내용을 전달하기 위한 메커니즘입니다. 이 체계를 사용하면 애플리케이션이 상태 집합 호출 컬렉션을 단일 정수로 정의된 상태 블록으로 정의할 수 있습니다. 이 정수 를 렌더링 상태로 보내면 한 번의 호출에서 모든 상태 변경 내용이 실행됩니다.

이렇게 하면 필요한 IDirect3DDevice7::SetRenderState 메서드 호출 수를 줄여 API 오버헤드를 줄이고 각 상태 변경을 실행하는 대신 상태 블록 정의 시 스테이지 변경을 자체 하드웨어별 형식으로 "미리 컴파일"할 수 있도록 하여 드라이버의 효율성을 향상시킬 수 있습니다. IDirect3DDevice7::SetRenderState 는 Direct3D SDK 설명서에 설명되어 있습니다.

대부분의 애플리케이션은 소수의 상태에서만 렌더링되므로 세분화된 상태 전환을 갖는 것은 거의 중요하지 않습니다. 더 중요한 것은 드라이버가 일반적인 렌더링 시나리오 간에 전환할 때 교환할 수 있는 상태 블록을 정의할 수 있다는 것입니다. 이것은 가속화된 상태 관리의 전체 지점입니다.

상태 집합 토큰은 드라이버의 상태를 기록하는 데 사용됩니다. 핸들은 상태 컬렉션을 참조합니다. D3DHAL_DP2STATESET 구조는 수행할 상태 집합 작업에 대해 드라이버에 알릴 수 있습니다.

D3DHAL_DP2STATESET 구조체의 dwOperation 멤버가 D3DHAL_STATESETBEGIN 설정된 경우 드라이버는 dwParam 멤버에 포함된 핸들의 상태를 기록하기 시작합니다. 드라이버가 D3DHAL_STATESETEND dwOperation 을 받으면 기록 상태가 중지됩니다.

dwOperation 멤버가 D3DHAL_STATESETDELETE 경우 dwParam 핸들에서 참조하는 상태 집합을 삭제해야 합니다.

dwOperation 멤버가 D3DHAL_STATESETEXECUTE 경우 dwParam 핸들에서 참조하는 상태 블록을 디바이스에 적용해야 합니다.

dwOperation 멤버가 D3DHAL_STATESETCAPTURE 경우 드라이버의 현재 상태를 특정 방식으로 캡처하여 상태 블록에 정의된 현재 상태의 스냅샷 제공해야 합니다. 즉, 상태 블록에 이미 있는 상태만 캡처됩니다. 따라서 상태 블록은 일종의 마스크 역할을 하며, 그 안에 정의된 상태만 기록합니다. 예를 들어 상태 블록에 D3DRENDERSTATE_ZENABLE 렌더링 상태가 있는 경우 D3DRENDERSTATE_ZENABLE 현재 상태가 캡처되어 상태 블록에 배치됩니다. 상태 블록에 D3DRENDERSTATE_ZENABLE 없으면 해당 상태가 캡처되지 않습니다.

상태 그룹화는 다양한 렌더링 시나리오에 대해 약간 수정할 수 있는 제네릭 상태 블록을 만드는 데 사용됩니다. 이러한 미리 정의된 그룹화(DirectX SDK 설명서의 D3DSTATEBLOCKTYPE에 열거됨)는 예상되는 반복 렌더링 시나리오를 수용하기 위해 나중에 상태 변경으로 수정할 수 있는 제네릭 상태 블록을 정의합니다. 예를 들어 드라이버는 미리 정의된 100개의 제네릭 상태 블록을 만든 다음, 다른 렌더링 시나리오에 맞게 각각을 약간 수정할 수 있습니다. 상태 블록 형식은 D3DHAL_DP2STATESET 구조체의 sbType 멤버에 전달됩니다.

sbType 멤버는 D3DHAL_STATESETBEGIN 및 D3DHAL_STATESETEND 대해서만 유효하며 다음 D3DSTATEBLOCKTYPE 열거형 형식 중 하나를 사용하여 미리 정의된 상태 블록 형식을 지정합니다. 상태 없음의 경우 NULL, 모든 상태에 대해 D3DSBT_ALL, 픽셀 상태에 D3DSBT_PIXELSTATE, 꼭짓점 상태의 경우 D3DSBT_VERTEXSTATE.

드라이버는 렌더링 상태 확장을 구현하지 않는 한sbType 멤버를 무시해야 합니다. 드라이버가 확장 렌더링 상태를 구현하는 경우, 즉 Direct3D 런타임에서 제공하는 상태 이외의 렌더링 상태를 구현하는 경우 sbType을 사용하여 미리 정의된 렌더링 상태의 유형을 확인할 수 있습니다. 이 정보에서 해당 확장을 지원하기 위해 상태 블록을 적절하게 추가하는 방법을 결정할 수 있습니다.