Implementing Overlay Flipping in a DirectDraw Driver
9/8/2008
O DirectDraw API fornece suporte para dois invertendo superfície e superfícies sobreposição. Os aplicativos podem combinar esses dois recursos dentro do DirectDraw para virar sobreposição surfaces da mesma forma que eles com superfícies exibição primária. Para obter mais informações, consulte Invertendo superfícies, Sobrepor Visão geral de superfície, e Invertendo superfícies sobreposição.
A Middleware DirectDraw fornece a infra-estrutura para manter suporte superfícies exibir e permitir invertendo entre eles. A digital para analógico conversor (conversor analógico-digital (DAC)) dentro de hardware gráfico trata a composição das superfícies primário e sobreposição. O driver atua como um intermediário entre o Middleware e o conversor analógico-digital (DAC), corretamente expor capacidades do hardware para a Middleware do DirectDraw e também gerenciar o fluxo de dados para o hardware gráfico.
Superfícies sobreposição sempre devem ser armazenadas no vídeo memória. Para implementar sobreposição invertendo, seu exibir hardware deve ter suficiente vídeo memória para suporte quantos sobreposição voltar buffers conforme necessário para a sobreposição do invertendo encadear.
Para permitir que o DirectDraw aplicativos saber que o driver oferece suporte a inversão sobreposição, você deve preparar um DDHAL_DDSURFACECALLBACKS estrutura pela configuração de bits funcionalidade e especificando implementações do seu driver de funções as gerenciamento de superfície do DirectDraw. Especificamente, o driver deve definir os sinalizadores DDHAL_SURFCB32_FLIP e DDHAL_SURFCB32_UPDATEOVERLAY e fornecem implementações para o Inverter e UpdateOverlay funções. Você expor as informações neste DDHAL_DDSURFACECALLBACKS estrutura quando você preparar seu DDHALINFO estrutura na sua implementação de HALInit.
Apenas como ocorre com o primário de superfície, você deve virar entre superfícies sobreposição durante o período blanking vertical. Esse processo, chamado tearing, impede que um parcial exibição seu novo superfície de exibição sejam exibidos enquanto a superfície anterior ainda está sendo desenhada. Tearing depende se seu hardware exibir é capaz de enviar uma interrupção para o período blanking vertical.
O método preferencial para identificador vertical blanking é fazer com o driver exibir, quando ele carrega, configurar uma interrupção blanking vertical no seu barramento sistema pela primeira vez. Isso permite que você implementar um manipulador interrupção que é executado em seu próprio segmento infinito e reage a seus eventos blanking verticais de chamadas para WaitForSingleObject. Essa abordagem elimina guesswork sobre quando o período blanking vertical irá ocorrer. Ele somente não é exato, mas também eficiente porque requer uma quantidade mínima absoluta do tempo de CPU enquanto aguardava o período blanking vertical, que é apenas suficiente para monitor segmento do manipulador de. Ao manipulador interrupção do seu driver é disparada, ela pode, em seguida, o direito versão dados para o hardware no direito exibir tempo.
Se seu hardware exibir não suporte uma interrupção blanking vertical e, em seguida, o driver necessário gastar alguns tempo de CPU para determinar quando o blanking vertical será ocorrer. Uma boa abordagem é ter segmento flipping de superfície do driver prever quando o próximo em branco vertical irá ocorrer e então dormir até que esse tempo. Isso libera o CPU para outras tarefas enquanto as linhas digitalizar para o atual superfície são sendo desenhadas. É preferível para ter o driver ativamente monitor a localidade de cada linha de digitalização e assim da vaga o CPU. Para obter um exemplo, consulte a implementação das HalFlip função no Tvia5000 exemplo driver codificar % _WINCEROOT%\Public\Common\OAK\Drivers\Display\Tvia5000\Halsurf.cpp.