Floating-Point Operations in Graphics Driver Functions

If a graphics driver function contains code that uses the floating-point unit (FPU), that code must be preceded by a call to EngSaveFloatingPointState and followed by a call to EngRestoreFloatingPointState. For a list of graphics driver functions, see Graphics Driver Functions.

If an FPU is available, it will be used by any code that assigns a value to a floating-point variable or performs calculations that involve floating-point numbers. For example, each of the following lines of code uses the FPU.

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

Suppose you are writing a DrvAlphaBlend function that uses the FPU. The following example demonstrates how you should save and restore the floating-point state.

#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 automatically saves the floating-point state for any calls to a driver's DrvEscape function when the escape is OPENGL_CMD, OPENGL_GETINFO, or MCDFUNCS. In those cases, you can use the FPU in your DrvEscape function without calling EngSaveFloatingPointState and EngRestoreFloatingPointState.

Most DirectDraw and Direct3D callback functions that perform floating-point operations should also save and restore the floating-point state. For more information, see Performing Floating-point Operations in DirectDraw and Performing Floating-point Operations in Direct3D.

For information about floating-point services provided by GDI, see GDI Floating-Point Services.