Compartir a través de


Operaciones de Floating-Point en funciones del controlador de gráficos

Si una función del controlador de gráficos contiene código que usa la unidad de punto flotante (FPU), ese código debe ir precedido de una llamada a EngSaveFloatingPointState y seguido de una llamada a EngRestoreFloatingPointState. Para obtener una lista de las funciones del controlador de gráficos, consulte Funciones del controlador de gráficos.

Si hay una FPU disponible, se usará en cualquier código que asigne un valor a una variable de punto flotante o realice cálculos que impliquen números de punto flotante. Por ejemplo, cada una de las siguientes líneas de código usa la FPU.

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

Supongamos que está escribiendo una función DrvAlphaBlend que usa la FPU. En el ejemplo siguiente se muestra cómo se debe guardar y restaurar el estado de punto flotante.

#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 guarda automáticamente el estado de punto flotante para las llamadas a la función DrvEscape de un controlador cuando el escape se OPENGL_CMD, OPENGL_GETINFO o MCDFUNCS. En esos casos, puede usar la FPU en la función DrvEscape sin llamar a EngSaveFloatingPointState y EngRestoreFloatingPointState.

La mayoría de las funciones de devolución de llamada de DirectDraw y Direct3D que realizan operaciones de punto flotante también deben guardar y restaurar el estado de punto flotante. Para obtener más información, vea Realizar operaciones de punto flotante en DirectDraw y Realizar operaciones de punto flotante en Direct3D.

Para obtener información sobre los servicios de punto flotante proporcionados por GDI, consulte GDI Floating-Point Services.