> ## Name

> cgD3D9UnloadProgram - destroy D3D shader and disable use of expanded interface routines

> ## Synopsis

>     #include <Cg/cgD3D9.h>

>     HRESULT cgD3D9UnloadProgram( CGprogram program );

> ## Parameters

> program
>   The program for which to disable expanded interface management. The CGprogram handle is still valid after this call.

> ## Return Values

> Returns D3D_OK if the function succeeds.

> Returns the D3D failure code if the function fails due to a D3D call.

> ## Description

> cgD3D9UnloadProgram destroys the D3D shader for a program and disables use of expanded interface routines for that program.

> This call does not destroy the CGprogram itself. It only destroys the resources used by the expanded interface, such as the D3D shader object and any shadowed parameters. Use the core runtime function cgDestroyProgram to free the CGprogram itself. Also note that freeing a CGprogram using the core runtime implicitly calls this routine to avoid resource leaks.

> This call is only necessary if specific lifetime control of expanded interface resources outside the lifetime of their associated CGprogram is desired. For instance, if the expanded interface is no longer used, but the CGprogram handle will still be used.

> ## Examples

>     // prog is a CGprogram initialized elsewhere
>     ...
>     HRESULT hres = cgD3D9UnloadProgram(prog);

> ## Errors

> cgD3D9Failed is generated if a D3D function returns an error.

> CGD3D9ERR_NOTLOADED is returned if program was not loaded with the cgD3D9LoadProgram.

> CGD3D9ERR_NODEVICE is returned if a required D3D device is NULL. This usually occurs when an expanded interface routine is called but a D3D device has not been set with cgD3D9SetDevice.

> ## History

> cgD3D9UnloadProgram was introduced in Cg 1.1.

> ## See Also

> cgD3D9UnloadAllPrograms, cgDestroyProgram