선형 메모리 할당

디스플레이 메모리는 다음 그림과 같이 맞춤 요구 사항을 고려하여 표면 너비에 맞게 피치를 변경할 수 있을 때마다 선형 으로 간주됩니다. 예를 들어 Blitter가 8비트 보폭에만 도달할 수 있고 31픽셀 스프라이트를 사용하는 경우 각 디스플레이 줄을 1씩 조정하여 다음 줄을 8 바이트 경계에 맞춥니다.

피치는 맞춤 요구 사항을 고려하여 픽셀 깊이(바이트)를 표면 너비로 곱하여 결정됩니다. 디스플레이가 640 8비트 픽셀인 경우 피치는 640입니다. 픽셀이 16비트(2바이트)이고 640 X 480 화면이 있는 경우 피치는 1280(640 * 2)입니다. 마찬가지로 너비 640, 32비트(4바이트) 픽셀 화면의 피치는 선형 디스플레이 메모리에서 2560(640 * 4)입니다.

다음 다이어그램에서는 기본 표면 하나와 스크래치 영역 1개를 사용하여 선형 메모리 힙 할당을 보여 줍니다.

diagram illustrating linear memory heap allocation.

기본 표면의 시작 부분에 대한 포인터는 VIDEOMEMORYINFO 구조체의 멤버인 fpPrimary입니다. VIDEOMEMORY 구조체의 fpStart 멤버가 나타내는 스크래치 영역의 시작 부분에 대한 포인터를 제공하기 위해 기본 표면 및 다양한 Windows 캐시의 크기가 여기에 추가됩니다. VIDEOMEMORY 구조의 fpEnd 멤버로 표시된 끝점은 나머지 메모리의 크기를 1에서 뺀 값을 추가하여 계산됩니다.

VIDEOMEMORY 구조는 디스플레이 메모리 힙을 관리하는 정보를 보유합니다. 이 샘플에는 하나의 힙만 있기 때문에 VIDEOMEMORY 구조 배열에 하나의 요소만 있습니다. videoMEMORY 구조체의 dwFlags 멤버에 있는 플래그인 VIDMEM_ISLINEAR 이를 선형 메모리로 표시합니다.

다음 의사 코드는 선형 메모리에 대해 VIDEOMEMORY 구조가 설정되는 방법을 보여 줍니다.

/*
 * video memory pool usage
 */
static VIDEOMEMORY vidMem [] = {
    { VIDMEM_ISLINEAR, 0x00000000, 0x00000000,
           { 0 }, { 0 } },
};/*

다음 의사 코드는 선형 메모리 힙을 설정하는 방법을 보여 줍니다.

/*
 * video memory pool information
 */

/* Calculate the number of video memory heaps */
    ddHALInfo.vmiData.dwNumHeaps = sizeof ( vidMem ) / sizeof ( vidMem [ 0 ] );

/* set up the pointer to the first available video memory after the primary surface */
    ddHALInfo.vmiData.pvmList     = vidMem;

/*
 * remainder of screen memory
 */

    VideoHeapBase = ddHALInfo.vmiData.fpPrimary + dwPrimarySurfaceSize + dwCacheSize;
    VideoHeapEnd = VideoHeapBase + dwDDOffScreenSize - 1;

    vidMem[ 0 ].fpStart = VideoHeapBase;
    vidMem[ 0 ].fpEnd = VideoHeapEnd;

사용 가능한 첫 번째 스크래치 영역의 시작은 기본 표면의 크기와 Windows 브러시, 펜 및 VDD 캐시의 크기에 GDI 기본 표면의 시작을 추가하여 계산됩니다. 결과는 VIDEOMEMORY 구조체의 첫 번째 요소에서 시작점을 스크래치 영역의 시작 부분으로 설정하는 데 사용됩니다.

스크래치 영역의 끝은 스크래치 영역의 크기에 스크래치 영역의 시작을 추가하고 포함되도록 1을 빼서 발견됩니다. 결과는 VIDEOMEMORY 구조체의 첫 번째 요소(및 이 경우만 해당) 요소의 끝점을 스크래치 영역의 끝으로 설정하는 데 사용됩니다. 둘 이상의 힙이 있는 경우 끝점은 이 힙의 끝으로 설정되고 다음 힙은 이 힙이 종료되는 위치에서 시작됩니다.