Name
cgSetContextBehavior - set the behavior for a context
Synopsis
#include <Cg/cg.h> void cgSetContextBehavior( CGcontext context, CGbehavior behavior );Parameters
- context
- The context for which the behavior will be set.
- behavior
- An enumerant which defines the behavior that will be exhibited by context. The following enumerants are allowed:
- CG_BEHAVIOR_3100
- CG_BEHAVIOR_3000
- CG_BEHAVIOR_2200
- CG_BEHAVIOR_CURRENT
- CG_BEHAVIOR_LATEST
Return Values
None.
Description
Each new version of Cg is supposed to be completely backwards compatible with previous versions, providing bug fixes and/or new capabilities while maintaining the behavior which applications were written against. The intent is to allow Cg to be updated and have existing applications continue to work exactly as designed.
Occasionally a case is made that some behavior of Cg is wrong, but fixing that behavior could break existing applications. This is a problem. cgSetContextBehavior provides a solution by documenting such changes to the library's behavior and allowing applications to explicitly opt-in to the new behavior. For applications which don't use cgSetContextBehavior Cg will continue to behave exactly as it did before this routine was introduced.
It is expected that the definition of a new context behavior will be a rare occurance and not something that happens with every new Cg release. Routine bug fixes and additions to the API won't result in creating new values of behavior. Instead this will only be done when the fix for a broken library behavior could cause a correctly written application to fail.
behavior must be one of the following enumerants :
- CG_BEHAVIOR_3100
- Cg 3.1 added a new method to define constant blocks using the uniform keyword. Using CG_BEHAVIOR_3100 enables recognition of this new construct and deprecates use of the BUFFER semantic on a struct to define a constant block. With CG_BEHAVIOR_3100 use of a buffer semantic on a struct will result in an error for GLSL profiles and a warning for all other profiles. See the Constant Buffers section of the Language Specification for details on defining constant buffers using the uniform keyword.
- CG_BEHAVIOR_3000
- Cg 3.0 added support for 16 additional texture units for a total of 32 using the semantics TEXUNIT16 through TEXUNIT31 and resource enums CG_TEXUNIT16 through CG_TEXUNIT31. To use these new resources, CG_BEHAVIOR_3000 is required. Using CG_BEHAVIOR_2200 with these new texture unit resources will result in a Cg error.
- CG_BEHAVIOR_2200
- This value specifies a pattern of behavior matching what was seen from Cg through release 2.2. Applications which specify CG_BEHAVIOR_2200 do not need to be modified to handle new context behaviors since they will continue to get the oldest behavior from the library.
- Note that this selection is the default behavior for applications which never call cgSetContextBehavior, which means that existing binaries will continue to get the behavior they expect from Cg. This is also the fallback behavior if an invalid value of behavior is passed to cgSetContextBehavior.
- CG_BEHAVIOR_CURRENT
- When this value is used the most advanced context behavior supported by the library will be determined at compile time and will become part of the application binary. Updating the Cg runtime files will not change the behavior seen by the application at runtime. However, if the updated version of Cg defines a new value for behavior then this new behavior will be used after the application is recompiled.
- CG_BEHAVIOR_LATEST
- When this value is used the most advanced context behavior supported by the library will be determined at application runtime. Updating the Cg runtime files may result in new behavior from Cg even though the same application binaries are being used.
- CG_BEHAVIOR_UNKNOWN
- This value is returned by cgGetBehaviorString to indicate an invalid string argument has been used. Passing CG_BEHAVIOR_UNKNOWN to cgSetContextBehavior will generate an CG_INVALID_ENUMERANT_ERROR and result in the context's behavior being set to CG_BEHAVIOR_2200 instead.
If the environment variable CG_BEHAVIOR is set to any of the valid CGbehavior enumerant names, then that context behavior will be used instead of the behavior compiled into the application binary. This is true even when the application doesn't explicitly call cgSetContextBehavior. Note that CG_BEHAVIOR_CURRENT and CG_BEHAVIOR_UNKNOWN are not valid choices for CG_BEHAVIOR. Trying to use either will result in an error.
Examples
/* create a context and set the behavior to CG_BEHAVIOR_3100 */ CGcontext context = cgCreateContext(); cgSetContextBehavior(context, CG_BEHAVIOR_3100);Errors
CG_INVALID_CONTEXT_HANDLE_ERROR is generated if context is not a valid context.
CG_INVALID_ENUMERANT_ERROR is generated if behavior is not CG_BEHAVIOR_3100, CG_BEHAVIOR_3000, CG_BEHAVIOR_2200, CG_BEHAVIOR_CURRENT, or CG_BEHAVIOR_LATEST.
History
cgSetContextBehavior was introduced in Cg 3.0.
See Also
cgCreateContext, cgGetContextBehavior, cgGetBehavior, cgGetBehaviorString