Condividi tramite


Floating-Point operazioni in Funzioni driver grafici

Se una funzione driver grafica contiene codice che usa l'unità a virgola mobile (FPU), tale codice deve essere preceduto da una chiamata a EngSaveFloatingPointState e seguita da una chiamata a EngRestoreFloatingPointState. Per un elenco di funzioni del driver grafico, vedere Funzioni driver grafici.

Se è disponibile un FPU, verrà usato da qualsiasi codice che assegna un valore a una variabile a virgola mobile o esegue calcoli che coinvolgono numeri a virgola mobile. Ad esempio, ognuna delle righe di codice seguenti usa l'FPU.

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

Si supponga di scrivere una funzione DrvAlphaBlend che usa l'FPU. Nell'esempio seguente viene illustrato come salvare e ripristinare lo stato a virgola mobile.

#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 salva automaticamente lo stato a virgola mobile per le chiamate alla funzione DrvEscape di un driver quando l'escape è OPENGL_CMD, OPENGL_GETINFO o MCDFUNCS. In questi casi, è possibile usare l'FPU nella funzione DrvEscape senza chiamare EngSaveFloatingPointState e EngRestoreFloatingPointState.

La maggior parte delle funzioni di callback DirectDraw e Direct3D che eseguono operazioni a virgola mobile deve anche salvare e ripristinare lo stato a virgola mobile. Per altre informazioni, vedere Esecuzione di operazioni a virgola mobile in DirectDraw ed esecuzione di operazioni a virgola mobile in Direct3D.

Per informazioni sui servizi a virgola mobile forniti da GDI, vedere GDI Floating-Point Services.