Partager via


opérations Floating-Point dans les fonctions du pilote Graphics

Si une fonction de pilote graphique contient du code qui utilise l’unité à virgule flottante (FPU), ce code doit être précédé d’un appel à EngSaveFloatingPointState et suivi d’un appel à EngRestoreFloatingPointState. Pour obtenir la liste des fonctions du pilote graphique, consultez Fonctions du pilote graphique.

Si un FPU est disponible, il est utilisé par tout code qui affecte une valeur à une variable à virgule flottante ou effectue des calculs qui impliquent des nombres à virgule flottante. Par exemple, chacune des lignes de code suivantes utilise le processeur FPU.

double myDouble = 5;
int myInt = 5 * 4.3;
int myInt = 50 * cos(2);

Supposons que vous écriviez une fonction DrvAlphaBlend qui utilise le processeur FPU. L’exemple suivant montre comment enregistrer et restaurer l’état à virgule flottante.

#define DRIVER_TAG // Put your driver tag here, for example 'zyxD'

BOOL DrvAlphaBlend(...)
{
   ...
   ULONG result;
 double floatVal;
   VOID* pBuf;
   ULONG bufSize;

 // Determine the size of the required buffer.
   bufSize = EngSaveFloatingPointState(NULL, 0);

 if(bufSize > 0)
   {
 // Allocate a zeroed buffer in the nonpaged pool.
      pBuf = EngAllocMem(
         FL_NONPAGED_MEMORY|FL_ZERO_MEMORY, bufSize, DRIVER_TAG);

 if(pBuf != NULL)
      {
 // The buffer was allocated successfully.
 // Save the floating-point state.
         result = EngSaveFloatingPointState(pBuf, bufSize);

 if(TRUE == result)
         {
 // The floating-point state was saved successfully.
 // Use the FPU.
            floatVal = 0.8;
            ...
            EngRestoreFloatingPointState(pBuffer);
         }

         EngFreeMem(pBuf);
      }
   }
   ...
}

GDI enregistre automatiquement l’état à virgule flottante pour tous les appels à la fonction DrvEscape d’un pilote lorsque l’échappement est OPENGL_CMD, OPENGL_GETINFO ou MCDFUNCS. Dans ce cas, vous pouvez utiliser le processeur FPU dans votre fonction DrvEscape sans appeler EngSaveFloatingPointState et EngRestoreFloatingPointState.

La plupart des fonctions de rappel DirectDraw et Direct3D qui effectuent des opérations à virgule flottante doivent également enregistrer et restaurer l’état à virgule flottante. Pour plus d’informations, consultez Exécution d’opérations à virgule flottante dans DirectDraw et Exécution d’opérations à virgule flottante dans Direct3D.

Pour plus d’informations sur les services à virgule flottante fournis par GDI, consultez GDI Floating-Point Services.