확장된 힙 제한 사항
DD_MORESURFACECAPS 구조는 가변 크기입니다. 항상 ddsCapsMore 멤버가 있지만 ddsExtendedHeapRestrictions 항목이 0개 이상 있을 수 있습니다. 드라이버가 GUID_DDMoreSurfaceCaps 쿼리에 응답하는 경우 DD_HALINFO 구조체에 표시 메모리 힙을 반환할 때 많은 ddsExtendedHeapRestrictions 항목이 포함된 DD_MORESURFACECAPS 구조체를 반환해야 합니다(DirectDraw는 드라이버가 DD_HALINFO 보고한 후 GUID_DDMoreSurfaceCaps 쿼리가 만들어지도록 보장합니다.)
또한 드라이버는 DD_MORESURFACECAPS 구조체에 적절한 dwSize 값을 입력해야 합니다. dwSize 값은 다음과 같이 계산됩니다.
DDMORESURFACECAPS.dwSize =
(DWORD) (sizeof(DDMORESURFACECAPS)
+ (((signed int)DDHALINFO.vmiData.dwNumHeaps) - 1)
* sizeof(DDSCAPSEX)*2 );
dwNumHeaps 값에서 1을 빼면 DD_MORESURFACECAPS 구조체에 1개 요소 배열인 ddsExtendedHeapRestrictions 멤버가 있다는 사실을 고려해야 합니다. 첫 번째(즉, ddsExtendedHeapRestrictions[1] 에서) 뒤의 배열 요소만 DD_MORESURFACECAPS 구조체의 총 크기를 계산하여 계산해야 합니다.
ddsCapsEx 및 ddsCapsExAlt 멤버는 DD_HALINFO 구조체의 멤버로 포함된 VIDEOMEMORYINFO 구조체의 pvmList 멤버에 반환된 VIDEOMEMORY 구조 배열의 ddsCaps 및 ddsCapsAlt 멤버와 정확히 유사합니다. ddsCapsEx의 모든 비트 집합은 해당 비트 집합이 있는 표면을 해당 힙에 배치해서는 안 됨을 의미합니다. ddsCapsExAlt 멤버에 설정된 비트는 해당 힙에 표면을 배치할 수 없음을 의미합니다. 표면을 할당할 때 DirectDraw는 먼저 모든 힙을 통과하고 VIDEOMEMORY 구조체의 ddsCaps 멤버에서 기능 비트가 표면의 DDSCAPS 비트와 일치하지 않는 힙을 찾으면 해당 힙의 표면을 할당합니다. 이 패스에서 이러한 힙을 찾지 못하면 DirectDraw는 동일한 패스를 수행하지만 ddsCapsEx 필드를 확인합니다. 이 패스가 힙을 찾지 못하면 힙에서 표면을 만들 수 없습니다.