diff options
| -rw-r--r-- | README.md | 306 | ||||
| -rw-r--r-- | doc/html/_m_a_i_n_p_a_g_e_8md_source.html | 101 | ||||
| -rw-r--r-- | doc/html/index.html | 7 | ||||
| -rw-r--r-- | doc/html/navtreedata.js | 2 | ||||
| -rw-r--r-- | doc/html/search/all_2.js | 3 | ||||
| -rw-r--r-- | doc/html/search/all_9.js | 1 | ||||
| -rw-r--r-- | doc/html/search/pages_1.js | 2 | ||||
| -rw-r--r-- | doc/html/search/searchdata.js | 2 |
8 files changed, 115 insertions, 309 deletions
@@ -3,7 +3,8 @@ # NVIDIA GeForce Experience SDK # {#section_main} * Version: 1.0.0.d2a45f0d -* Built for GFE Version: 3.9.0.37 +* Built against GFE Version: 3.9.0.37 +* GeForce Experience minimum version: 3.8 * See [Changelog](\ref section_changelog) ## At a Glance {#section_glance} @@ -12,305 +13,8 @@ The GeForce SDK (GfeSDK) is a means for games to integrate with ShadowPlay Highl and screenshots and present the resulting highlights back to users for viewing and sharing. GfeSDK will add other features over time that benefit from games and applications working in concert with GFE functionality. - + -### Software Stack {#section_stack} +## Development Guide - - -An application integrates with the GfeSDK via either the provided Unreal Engine 4 plug-in, C++ interface, or C interface. This integration, via the SDK, calls a compatible GFE 3.0 release. - -The developer (or associated publisher) distributes the application (including associated SDK libraries). - -NVIDIA distributes a GfeSDK package coupled with GfeSDK-compatible GFE releases. GFE maintains backwards SDK-compatibility; games integrated with older SDKs work with newer GFE releases. - -### GfeSDK Package {#section_package} - -The distribution will look like the following -``` -. -+-- README.md -+-- LICENSE -+-- doc -| +-- index.html # Points to the deeper index.html -| +-- html -| | +-- index.html -| | ... -+-- include -| +-- gfesdk -| | +-- bindings -| | | +-- cpp # C++ bindings that sit on top of C API -| | +-- isdk.h -| | ... -+-- lib -| +-- win32 -| | +-- GfeSDK.lib # x86 Import library for linking -| +-- win64 -| | +-- GfeSDK.lib # x64 Import library for linking -+-- redist -| +-- win32 -| | +-- GfeSDK.dll # x86 DLL to be shipped with the game -| +-- win64 -| | +-- GfeSDK.dll # x64 DLL to be shipped with the game -+-- samples -``` - -### Compiling And Linking {#section_compiling} - -To compile, add the ./include (not the ./include/gfesdk) directory to the compiler's list of includes. The import libraries -are found in the ./lib folder and can be used to link the symbols into the game's executable. The proper GfeSDK.dll file -will need to be distributed with the game in a place that the game can find it. - -The C++ bindings are currently distributed in header-only form to avoid ABI incompatibilities between different compiler -versions. The linking and include steps are the same. - -## Using GfeSDK ## {#section_using} - -Creation and destruction of an SDK instance is a prerequisite to making calls -to the SDK. The means of creating and destroying an instance depend on which -integration mechanism the client employs: - -See [Core header documentation](\ref isdk.h) - -See [Highlights header documentation](\ref ihighlights.h) - -### Creation and Release {#section_example_create} - -#### C++ Bindings - -\snippet GfeSDKDemo.cpp Creation CPP - -// After using GfeSDK - -\snippet GfeSDKDemo.cpp Release CPP - -#### C API - -\snippet GfeSDKDemo.cpp Creation - -// After using GfeSDK - -\snippet GfeSDKDemo.cpp Release - -### Request Permissions {#section_example_permission} - -The Create call will inform the app if one or more scopes require user -permission. If so, make this call. It will display the overlay UI. - -#### C++ Bindings - -\snippet GfeSDKDemo.cpp Permissions CPP - -#### C API - -\snippet GfeSDKDemo.cpp Permissions - -### Configure Highlights {#section_example_highlightsconfigure} - -This only needs to happen once ever. It is persistent. It could even happen -during game installation. - -#### C++ Bindings - -\snippet GfeSDKDemo.cpp ConfigureHighlights CPP - -#### C API - -\snippet GfeSDKDemo.cpp ConfigureHighlights - -### Groups and Saving Highlights {#section_Example_highlights} - -#### C++ Bindings - -\snippet GfeSDKDemo.cpp OpenGroup CPP -\snippet GfeSDKDemo.cpp SaveVideo CPP -\snippet GfeSDKDemo.cpp CloseGroup CPP - -#### C API - -\snippet GfeSDKDemo.cpp OpenGroup -\snippet GfeSDKDemo.cpp SaveVideo -\snippet GfeSDKDemo.cpp CloseGroup - -### Open Highlight Summary {#section_example_summary} - -#### C++ Bindings - -\snippet GfeSDKDemo.cpp OpenSummary CPP - -#### C API - -\snippet GfeSDKDemo.cpp OpenSummary - -## Concepts {#section_concepts} - -The GfeSDK is composed of two parts, the client/app, and the backend/server. -This distribution contains GfeSDK.dll which represents the client/app part. -The end-user downloads GFE onto their machine. The GFE package includes the -backend pieces necessary to support the calls coming from the client. See -\ref section_version for more information regarding this communication. - -Calls made will be serialized. Therefore, if the app makes two consecutive -calls to NVGSDK_Highlights_OpenGroup and then either -NVGSDK_Highlights_SetVideoHighlight or NVGSDK_Highlights_SetScreenshotHighlight, -before receiving the callback from open group, the set highlight call will -function normally. If open group succeeded, then the set highlights calls will -succeed as well. If it failed, the set highlights calls will fail, as there -will be no valid group to assign them to. - -### Strings {#section_strings} -All strings are to be provided in single-byte width, UTF-8 encoded. - -### Versioning {#section_version} -Because there are two different parts, and the client / user's machine may -be mismatched at times, the game should be aware of the versioning system. -It's GfeSDK's goal to make this as seamless as possible, but there could still -be compatibility issues to be aware of. - -The GfeSDK version contains 4 parts, MAJOR.MINOR.BUILD.HASH. The BUILD and HASH -components are descriptive and don't have any effect on functionality. The -MAJOR component identifies overall compatibility. If the client and server -mismatch on the major version number, no communication is possible. **There -are no current plans to update from 1, breaking communication**. The major -version number gives a way to show incompatibility if the fundamental -architecture of GFE ever changes. The minor version number indicates feature -compatibility. When a new feature gets added / modified on the SDK, the minor -version number will be bumped. This means that for older games / newer GFE -installations, the game is simply missing out on newer features. This will -generally not be a problem. For a game with a newer version of the GfeSDK, -and a user with an older installation of GFE, some features may not function, -and the user should be encouraged to update GFE. - -With that in mind, here are the possible return values from \ref NVGSDK_Create, -with regards to versioning: -* **NVGSDK_SUCCESS** - Perfect version match -* **NVGSDK_SUCCESS_OLD_GFE** - Minor version mismatch. User has an older -version of GFE installed. Newer features distributed by the game will not -function properly until the user upgrades. -* **NVGSDK_SUCCESS_OLD_SDK** - Minor version mismatch. -Game is distributing an older version of GfeSDK. -Game could be missing out on latest features, but no compatibily issue. -* **NVGSDK_ERR_GFE_VERSION** - Major version mismatch. User has a GFE -installation that predates the GfeSDK. User must upgrade to get functionality. -* **NVGSDK_ERR_SDK_VERSION** - Major version mismatch. GFE has changed -fundamentally. **There are no plans to do this. This is to cover all bases** - -### Permissions {#section_permissions} -Certain actions require permission from the user. For example, recording video -for Highlights requires the user to agree to the recording. To achieve this, -the app must know what features it wishes to enable. It will pass these -"scopes" into the NVGSDK_Create call via NVGSDK_CreateInputParams. Consider -the typical Highlights case as an example. The app will pass in a list of -the scopes NVGSDK_SCOPE_HIGHLIGHTS, NVGSDK_SCOPE_HIGHLIGHTS_VIDEO, and -NVGSDK_SCOPE_SCREENSHOT. The first of these is required in order for any -of the NVGSDK_Highlights_* calls to succeed and send a message to the server. -It will allocate the resources required in the DLL and on the server in order -to achieve this. The second of these permissions is required in order to -capture video of the gameplay, and the final is to capture a screenshot. - -The first time the user runs the game, and the game calls NVGSDK_Create(...), -and passes in these three permissions, the game might receive back that -NVGSDK_SCOPE_HIGHLIGHTS has been granted permission implicitly, but that -NVGSDK_SCOPE_HIGHLIGHTS_VIDEO and NVGSDK_SCOPE_HIGHLIGHTS_SCREENSHOT -currently have "must ask" permission. In other words, the game must ask -GFE for permission to record video before it will succeed in doing so. To -achieve this, the game will call NVGSDK_RequestPermissionsAsync with two -scopes in the list, NVGSDK_SCOPE_HIGHLIGHTS_VIDEO and -NVGSDK_SCOPE_HIGHLIGHTS_SCREENSHOT. It's not necessary to request permission -for a scope that has implicitly been granted permission already. - -The call to NVGSDK_RequestPermissions is required because it will trigger -GFE to put up an \ref section_igo. The game might not want this to occur -during NVGSDK_Create time. Once called, the user will see the overlay -pop up, asking them for permission. - - - -The async callback will be triggered as soon as the message is processed -by the GFE backend. The user will be able to accept, deny, or defer the -request. If the user accepts or denies the request, the app will recieve -a \ref NVGSDK_NOTIFICATION_PERMISSIONS_CHANGED notification with the results. -If \ref NVGSDK_RequestPermissionsAsync is called again when the permission is -already granted or denied, the overlay will not be displayed a second time. -The user can reverse their decision in either case later on in GFE3 on -the games details page. - -### Asynchronous Calls {#section_async} -Most of the calls to GfeSDK are asynchronous. This is due to the client/server -architecture described in \ref section_concepts. For each asynchronous call, a -callback and an opaque void* context are passed in as arguments. If the app -does not care or desire to know what happens to the call, is it fine to pass -in NULL. If the app does care, supply a callback of the proper type, and -optionally a pointer as a context to receive back during the callback. - -The callbacks are properly typed. For callbacks that return nothing but the -return value and context, a \ref NVGSDK_EmptyCallback is passed in. For -versions that do return data, a typed callback is passed in, such as -\ref NVGSDK_GetUILanguageCallback. - -The callback will be called on one of three threads, depending on the -situation. If NVGSDK_CreateInputParams::pollForCallbacks is set to false -during creation, the callback will always occur on a GfeSDK controller thread. -If the app desires callback to occur on their own thread, true is passed in -instead. In that case, the callback will occur on the thread that calls -\ref NVGSDK_Poll. The exception is that during \ref NVGSDK_Destroy, GfeSDK -pushes out all remaining callbacks. If the app is awaiting any callbacks -during this time, they will be called on the same thread that called -NVGSDK_Destroy. Usually, this will be the same thread that calls NVGSDK_Poll, -so it shouldn't cause any surprises, but it's something to be aware of. See -\ref section_threading for more information - -**Note:** There is currently a limitation in the GfeSDK backend that depends -on game frames being rendered during certain API calls. Therefore, the game -cannot block the render loop while awaiting an asynchronous callback. Doing -so will result in a deadlock. - -### Notifications ### {#section_notifications} - -In addition to the async callbacks that most of the APIs accept as an argument, -the app can also register to recieve unsolicited notifications when certain -events occur. For example, the app might want to know when the user can -given / removed permission for recording video from the app, either through -the permissions dialog, or via GFE3. See \ref NVGSDK_CreateInputParams and -\ref NVGSDK_NotificationType - -This notification will get called on either the GfeSDK callback thread, or -the thread that calls \ref NVGSDK_Poll, depending on params passed in to -\ref NVGSDK_Create. See \ref section_threading for more information. - -### Threading {#section_threading} -There are two different threading models that may be used. The model used -depends on the value passed in to \ref NVGSDK_CreateInputParams - -##### GfeSDK Controller Callback Model -In this model, all callbacks will occur as soon as they are processed on the -internal GfeSDK callback thread. - -##### Polling Model -The app can choose to use this model if it wants to take action during the -callback that depend on being on the game loop. Callbacks are queued up, and -executed when the app calls \ref NVGSDK_Poll. This means that callbacks will -be blocked indefinitely if that API is never called. - -The exception occurs during \ref NVGSDK_Destroy. Because the normal case is -to make NVGSDK_Destroy and NVGSDK_Poll calls from the same thread, GfeSDK -can't block and wait for another poll call. All remaining callbacks will be -executed during \ref NVGSDK_Destroy. See \ref section_async for more info. - -### In Game Overlay {#section_igo} - - -The In-Game overlay can be used by the user to change Highlights settings, and -view Highlights that have been saved to the gallery. It's also used to display -the permissions dialog from \ref NVGSDK_RequestPermissionsAsync, and the -group summary from \ref NVGSDK_OpenGroupSummaryAsync. The user can open it -up by themselves using the default keybinding Alt+Z - -### Logging {#section_log} -By default, GfeSDK stores its own logs for problem triage in -%LOCALAPPDATA%\NVIDIA Corporation\GfeSDK. This behavior can be adjusted by -the following calls: - -* \ref NVGSDK_SetLogLevel -* \ref NVGSDK_AttachLogListener -* \ref NVGSDK_SetListenerLogLevel +See the documentation [here](./doc/index.html) diff --git a/doc/html/_m_a_i_n_p_a_g_e_8md_source.html b/doc/html/_m_a_i_n_p_a_g_e_8md_source.html new file mode 100644 index 0000000..2b3b06f --- /dev/null +++ b/doc/html/_m_a_i_n_p_a_g_e_8md_source.html @@ -0,0 +1,101 @@ +<!-- HTML header for doxygen 1.8.12--> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.12"/> +<meta name="viewport" content="width=device-width, initial-scale=1"/> +<title>NVIDIAGeForceExperienceSDK: MAINPAGE.md Source File</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="navtree.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="resize.js"></script> +<script type="text/javascript" src="navtreedata.js"></script> +<script type="text/javascript" src="navtree.js"></script> +<script type="text/javascript"> + $(document).ready(initResizable); +</script> +<link href="search/search.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="search/searchdata.js"></script> +<script type="text/javascript" src="search/search.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +<link href="customdoxygen.css" rel="stylesheet" type="text/css"/> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">NVIDIAGeForceExperienceSDK + </div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.12 --> +<script type="text/javascript"> +var searchBox = new SearchBox("searchBox", "search",false,'Search'); +</script> +<script type="text/javascript" src="menudata.js"></script> +<script type="text/javascript" src="menu.js"></script> +<script type="text/javascript"> +$(function() { + initMenu('',true,false,'search.php','Search'); + $(document).ready(function() { init_search(); }); +}); +</script> +<div id="main-nav"></div> +</div><!-- top --> +<div id="side-nav" class="ui-resizable side-nav-resizable"> + <div id="nav-tree"> + <div id="nav-tree-contents"> + <div id="nav-sync" class="sync"></div> + </div> + </div> + <div id="splitbar" style="-moz-user-select:none;" + class="ui-resizable-handle"> + </div> +</div> +<script type="text/javascript"> +$(document).ready(function(){initNavTree('_m_a_i_n_p_a_g_e_8md.html','');}); +</script> +<div id="doc-content"> +<!-- window showing the filter options --> +<div id="MSearchSelectWindow" + onmouseover="return searchBox.OnSearchSelectShow()" + onmouseout="return searchBox.OnSearchSelectHide()" + onkeydown="return searchBox.OnSearchSelectKey(event)"> +</div> + +<!-- iframe showing the search results (closed by default) --> +<div id="MSearchResultsWindow"> +<iframe src="javascript:void(0)" frameborder="0" + name="MSearchResults" id="MSearchResults"> +</iframe> +</div> + +<div class="header"> + <div class="headertitle"> +<div class="title">MAINPAGE.md</div> </div> +</div><!--header--> +<div class="contents"> +<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> # Development Guide # {#mainpage}</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> </div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> # NVIDIA GeForce Experience SDK # {#section_main}</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> </div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> * Version: 1.0.0.d2a45f0d</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> * Built against GFE Version: 3.9.0.37</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> * GeForce Experience minimum version: 3.8</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> * See [Changelog](\ref section_changelog)</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> </div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> ## At a Glance {#section_glance}</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> </div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> The GeForce SDK (GfeSDK) is a means for games to integrate with ShadowPlay Highlights allowing them to capture videos</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> and screenshots and present the resulting highlights back to users for viewing and sharing. GfeSDK will add other features</div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> over time that benefit from games and applications working in concert with GFE functionality.</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> </div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> ### Software Stack {#section_stack}</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> </div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> </div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> An application integrates with the GfeSDK via either the provided Unreal Engine 4 plug-in, C++ interface, or C interface. This integration, via the SDK, calls a compatible GFE 3.0 release. </div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> </div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> The developer (or associated publisher) distributes the application (including associated SDK libraries).</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> </div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> NVIDIA distributes a GfeSDK package coupled with GfeSDK-compatible GFE releases. GFE maintains backwards SDK-compatibility; games integrated with older SDKs work with newer GFE releases.</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> </div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> ### GfeSDK Package {#section_package}</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> The distribution will look like the following</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> ```</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> .</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> +-- README.md</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> +-- LICENSE</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> +-- doc</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> | +-- index.html # Points to the deeper index.html</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> | +-- html</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> | | +-- index.html</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> | | ...</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> +-- include</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> | +-- gfesdk</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> | | +-- bindings </div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> | | | +-- cpp # C++ bindings that sit on top of C API</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> | | +-- isdk.h</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> | | ...</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> +-- lib</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> | +-- win32</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> | | +-- GfeSDK.lib # x86 Import library for linking</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> | +-- win64</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> | | +-- GfeSDK.lib # x64 Import library for linking</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> +-- redist</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> | +-- win32</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> | | +-- GfeSDK.dll # x86 DLL to be shipped with the game</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span> | +-- win64</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> | | +-- GfeSDK.dll # x64 DLL to be shipped with the game</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> +-- samples</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span> ```</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> </div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span> ### Compiling And Linking {#section_compiling}</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> </div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span> To compile, add the ./include (not the ./include/gfesdk) directory to the compiler's list of includes. The import libraries</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span> are found in the ./lib folder and can be used to link the symbols into the game's executable. The proper GfeSDK.dll file</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span> will need to be distributed with the game in a place that the game can find it.</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span> </div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> The C++ bindings are currently distributed in header-only form to avoid ABI incompatibilities between different compiler</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span> versions. The linking and include steps are the same.</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span> </div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span> ## Using GfeSDK ## {#section_using}</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span> </div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span> Creation and destruction of an SDK instance is a prerequisite to making calls</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span> to the SDK. The means of creating and destroying an instance depend on which</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span> integration mechanism the client employs:</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span> </div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span> See [Core header documentation](\ref isdk.h)</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span> </div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span> See [Highlights header documentation](\ref ihighlights.h)</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span> </div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span> ### Creation and Release {#section_example_create}</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span> </div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span> #### C++ Bindings</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span> </div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span> \snippet GfeSDKDemo.cpp Creation CPP</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span> </div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span> // After using GfeSDK</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span> </div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span> \snippet GfeSDKDemo.cpp Release CPP</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span> </div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span> #### C API</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span> </div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span> \snippet GfeSDKDemo.cpp Creation</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span> </div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span> // After using GfeSDK</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span> </div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span> \snippet GfeSDKDemo.cpp Release</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span> </div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span> ### Request Permissions {#section_example_permission}</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span> </div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span> The Create call will inform the app if one or more scopes require user</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span> permission. If so, make this call. It will display the overlay UI.</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span> </div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> #### C++ Bindings</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span> </div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span> \snippet GfeSDKDemo.cpp Permissions CPP</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span> </div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span> #### C API</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span> </div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span> \snippet GfeSDKDemo.cpp Permissions</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span> </div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span> ### Configure Highlights {#section_example_highlightsconfigure}</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span> </div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span> This only needs to happen once ever. It is persistent. It could even happen</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span> during game installation.</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span> </div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span> #### C++ Bindings</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span> </div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span> \snippet GfeSDKDemo.cpp ConfigureHighlights CPP</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span> </div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span> #### C API</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span> </div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span> \snippet GfeSDKDemo.cpp ConfigureHighlights</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span> </div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span> ### Groups and Saving Highlights {#section_Example_highlights}</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span> </div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span> #### C++ Bindings</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span> </div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span> \snippet GfeSDKDemo.cpp OpenGroup CPP</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span> \snippet GfeSDKDemo.cpp SaveVideo CPP</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span> \snippet GfeSDKDemo.cpp CloseGroup CPP</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span> </div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span> #### C API</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span> </div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span> \snippet GfeSDKDemo.cpp OpenGroup</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span> \snippet GfeSDKDemo.cpp SaveVideo</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span> \snippet GfeSDKDemo.cpp CloseGroup</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span> </div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span> ### Open Highlight Summary {#section_example_summary}</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span> </div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span> #### C++ Bindings</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span> </div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span> \snippet GfeSDKDemo.cpp OpenSummary CPP</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span> </div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span> #### C API</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span> </div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span> \snippet GfeSDKDemo.cpp OpenSummary</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span> </div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span> ## Concepts {#section_concepts}</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span> </div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span> The GfeSDK is composed of two parts, the client/app, and the backend/server.</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span> This distribution contains GfeSDK.dll which represents the client/app part.</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span> The end-user downloads GFE onto their machine. The GFE package includes the</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span> backend pieces necessary to support the calls coming from the client. See</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span> \ref section_version for more information regarding this communication.</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span> </div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span> Calls made will be serialized. Therefore, if the app makes two consecutive</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span> calls to NVGSDK_Highlights_OpenGroup and then either</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span> NVGSDK_Highlights_SetVideoHighlight or NVGSDK_Highlights_SetScreenshotHighlight,</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span> before receiving the callback from open group, the set highlight call will</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span> function normally. If open group succeeded, then the set highlights calls will</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span> succeed as well. If it failed, the set highlights calls will fail, as there</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span> will be no valid group to assign them to.</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span> </div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span> ### Strings {#section_strings}</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> All strings are to be provided in single-byte width, UTF-8 encoded.</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span> </div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span> ### Versioning {#section_version}</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span> Because there are two different parts, and the client / user's machine may</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span> be mismatched at times, the game should be aware of the versioning system.</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span> It's GfeSDK's goal to make this as seamless as possible, but there could still</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span> be compatibility issues to be aware of.</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span> </div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span> The GfeSDK version contains 4 parts, MAJOR.MINOR.BUILD.HASH. The BUILD and HASH</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span> components are descriptive and don't have any effect on functionality. The</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span> MAJOR component identifies overall compatibility. If the client and server</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span> mismatch on the major version number, no communication is possible. **There</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span> are no current plans to update from 1, breaking communication**. The major</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span> version number gives a way to show incompatibility if the fundamental</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span> architecture of GFE ever changes. The minor version number indicates feature</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span> compatibility. When a new feature gets added / modified on the SDK, the minor</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span> version number will be bumped. This means that for older games / newer GFE</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span> installations, the game is simply missing out on newer features. This will</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span> generally not be a problem. For a game with a newer version of the GfeSDK,</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span> and a user with an older installation of GFE, some features may not function,</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span> and the user should be encouraged to update GFE.</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span> </div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span> With that in mind, here are the possible return values from \ref NVGSDK_Create,</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span> with regards to versioning:</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span> * **NVGSDK_SUCCESS** - Perfect version match</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span> * **NVGSDK_SUCCESS_OLD_GFE** - Minor version mismatch. User has an older</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span> version of GFE installed. Newer features distributed by the game will not</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span> function properly until the user upgrades.</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span> * **NVGSDK_SUCCESS_OLD_SDK** - Minor version mismatch.</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span> Game is distributing an older version of GfeSDK.</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span> Game could be missing out on latest features, but no compatibily issue. </div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span> * **NVGSDK_ERR_GFE_VERSION** - Major version mismatch. User has a GFE</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span> installation that predates the GfeSDK. User must upgrade to get functionality.</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span> * **NVGSDK_ERR_SDK_VERSION** - Major version mismatch. GFE has changed</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span> fundamentally. **There are no plans to do this. This is to cover all bases**</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span> </div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span> ### Permissions {#section_permissions}</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span> Certain actions require permission from the user. For example, recording video</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span> for Highlights requires the user to agree to the recording. To achieve this,</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span> the app must know what features it wishes to enable. It will pass these</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span> "scopes" into the NVGSDK_Create call via NVGSDK_CreateInputParams. Consider</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span> the typical Highlights case as an example. The app will pass in a list of</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span> the scopes NVGSDK_SCOPE_HIGHLIGHTS, NVGSDK_SCOPE_HIGHLIGHTS_VIDEO, and</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span> NVGSDK_SCOPE_SCREENSHOT. The first of these is required in order for any</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span> of the NVGSDK_Highlights_* calls to succeed and send a message to the server.</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span> It will allocate the resources required in the DLL and on the server in order</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span> to achieve this. The second of these permissions is required in order to</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span> capture video of the gameplay, and the final is to capture a screenshot.</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span> </div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span> The first time the user runs the game, and the game calls NVGSDK_Create(...),</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span> and passes in these three permissions, the game might receive back that</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span> NVGSDK_SCOPE_HIGHLIGHTS has been granted permission implicitly, but that</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span> NVGSDK_SCOPE_HIGHLIGHTS_VIDEO and NVGSDK_SCOPE_HIGHLIGHTS_SCREENSHOT</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span> currently have "must ask" permission. In other words, the game must ask</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span> GFE for permission to record video before it will succeed in doing so. To</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span> achieve this, the game will call NVGSDK_RequestPermissionsAsync with two</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span> scopes in the list, NVGSDK_SCOPE_HIGHLIGHTS_VIDEO and</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span> NVGSDK_SCOPE_HIGHLIGHTS_SCREENSHOT. It's not necessary to request permission</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span> for a scope that has implicitly been granted permission already.</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span> </div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span> The call to NVGSDK_RequestPermissions is required because it will trigger</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span> GFE to put up an \ref section_igo. The game might not want this to occur</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span> during NVGSDK_Create time. Once called, the user will see the overlay</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span> pop up, asking them for permission.</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span> </div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span> </div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span> </div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span> The async callback will be triggered as soon as the message is processed</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span> by the GFE backend. The user will be able to accept, deny, or defer the</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span> request. If the user accepts or denies the request, the app will recieve</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span> a \ref NVGSDK_NOTIFICATION_PERMISSIONS_CHANGED notification with the results.</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span> If \ref NVGSDK_RequestPermissionsAsync is called again when the permission is</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span> already granted or denied, the overlay will not be displayed a second time.</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span> The user can reverse their decision in either case later on in GFE3 on</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span> the games details page.</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span> </div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span> ### Asynchronous Calls {#section_async}</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span> Most of the calls to GfeSDK are asynchronous. This is due to the client/server</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span> architecture described in \ref section_concepts. For each asynchronous call, a</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span> callback and an opaque void* context are passed in as arguments. If the app</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span> does not care or desire to know what happens to the call, is it fine to pass</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span> in NULL. If the app does care, supply a callback of the proper type, and</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span> optionally a pointer as a context to receive back during the callback.</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span> </div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span> The callbacks are properly typed. For callbacks that return nothing but the</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span> return value and context, a \ref NVGSDK_EmptyCallback is passed in. For</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span> versions that do return data, a typed callback is passed in, such as</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span> \ref NVGSDK_GetUILanguageCallback.</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span> </div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span> The callback will be called on one of three threads, depending on the</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span> situation. If NVGSDK_CreateInputParams::pollForCallbacks is set to false</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span> during creation, the callback will always occur on a GfeSDK controller thread.</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span> If the app desires callback to occur on their own thread, true is passed in</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span> instead. In that case, the callback will occur on the thread that calls</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span> \ref NVGSDK_Poll. The exception is that during \ref NVGSDK_Destroy, GfeSDK</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span> pushes out all remaining callbacks. If the app is awaiting any callbacks</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span> during this time, they will be called on the same thread that called</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span> NVGSDK_Destroy. Usually, this will be the same thread that calls NVGSDK_Poll,</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span> so it shouldn't cause any surprises, but it's something to be aware of. See</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span> \ref section_threading for more information</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span> </div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span> **Note:** There is currently a limitation in the GfeSDK backend that depends</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span> on game frames being rendered during certain API calls. Therefore, the game</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span> cannot block the render loop while awaiting an asynchronous callback. Doing</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span> so will result in a deadlock.</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span> </div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span> ### Notifications ### {#section_notifications}</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span> </div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span> In addition to the async callbacks that most of the APIs accept as an argument,</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span> the app can also register to recieve unsolicited notifications when certain</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span> events occur. For example, the app might want to know when the user can</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span> given / removed permission for recording video from the app, either through</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span> the permissions dialog, or via GFE3. See \ref NVGSDK_CreateInputParams and</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span> \ref NVGSDK_NotificationType</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span> </div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span> This notification will get called on either the GfeSDK callback thread, or</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span> the thread that calls \ref NVGSDK_Poll, depending on params passed in to</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span> \ref NVGSDK_Create. See \ref section_threading for more information.</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span> </div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span> ### Threading {#section_threading}</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span> There are two different threading models that may be used. The model used</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span> depends on the value passed in to \ref NVGSDK_CreateInputParams</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span> </div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span> ##### GfeSDK Controller Callback Model</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span> In this model, all callbacks will occur as soon as they are processed on the</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span> internal GfeSDK callback thread.</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span> </div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span> ##### Polling Model</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span> The app can choose to use this model if it wants to take action during the</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span> callback that depend on being on the game loop. Callbacks are queued up, and</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span> executed when the app calls \ref NVGSDK_Poll. This means that callbacks will</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span> be blocked indefinitely if that API is never called.</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span> </div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span> The exception occurs during \ref NVGSDK_Destroy. Because the normal case is</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span> to make NVGSDK_Destroy and NVGSDK_Poll calls from the same thread, GfeSDK</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span> can't block and wait for another poll call. All remaining callbacks will be</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span> executed during \ref NVGSDK_Destroy. See \ref section_async for more info.</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span> </div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span> ### In Game Overlay {#section_igo}</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span> </div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span> </div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span> The In-Game overlay can be used by the user to change Highlights settings, and</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span> view Highlights that have been saved to the gallery. It's also used to display</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span> the permissions dialog from \ref NVGSDK_RequestPermissionsAsync, and the</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span> group summary from \ref NVGSDK_OpenGroupSummaryAsync. The user can open it</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span> up by themselves using the default keybinding Alt+Z</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span> </div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span> ### Logging {#section_log}</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span> By default, GfeSDK stores its own logs for problem triage in</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span> %LOCALAPPDATA%\NVIDIA Corporation\GfeSDK. This behavior can be adjusted by</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span> the following calls:</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span> </div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span> * \ref NVGSDK_SetLogLevel</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span> * \ref NVGSDK_AttachLogListener</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span> * \ref NVGSDK_SetListenerLogLevel</div></div><!-- fragment --></div><!-- contents --> +</div><!-- doc-content --> +<!-- HTML footer for doxygen 1.8.12--> +<!-- start footer part --> +<div id="nav-path" class="navpath"><!-- id is needed for treeview function! --> + <ul> + <li class="navelem"><b>MAINPAGE.md</b></li> + <li class="footer">Generated by + <a href="http://www.doxygen.org/index.html"> + doxygen</a> 1.8.12 </li> + </ul> +</div> +</body> +</html> diff --git a/doc/html/index.html b/doc/html/index.html index 36f963a..6df6e5d 100644 --- a/doc/html/index.html +++ b/doc/html/index.html @@ -6,7 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=9"/> <meta name="generator" content="Doxygen 1.8.12"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> -<title>NVIDIAGeForceExperienceSDK: Overview</title> +<title>NVIDIAGeForceExperienceSDK: Development Guide</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="dynsections.js"></script> @@ -82,14 +82,15 @@ $(document).ready(function(){initNavTree('index.html','');}); <div class="header"> <div class="headertitle"> -<div class="title">Overview </div> </div> +<div class="title">Development Guide </div> </div> </div><!--header--> <div class="contents"> <div class="textblock"><h1><a class="anchor" id="section_main"></a> NVIDIA GeForce Experience SDK</h1> <ul> <li>Version: 1.0.0.d2a45f0d</li> -<li>Built for GFE Version: 3.9.0.37</li> +<li>Built against GFE Version: 3.9.0.37</li> +<li>GeForce Experience minimum version: 3.8</li> <li>See <a class="el" href="section_changelog.html">Changelog</a></li> </ul> <h2><a class="anchor" id="section_glance"></a> diff --git a/doc/html/navtreedata.js b/doc/html/navtreedata.js index 3a0487d..10472c0 100644 --- a/doc/html/navtreedata.js +++ b/doc/html/navtreedata.js @@ -1,7 +1,7 @@ var NAVTREE = [ [ "NVIDIAGeForceExperienceSDK", "index.html", [ - [ "Overview", "index.html", [ + [ "Development Guide", "index.html", [ [ "NVIDIA GeForce Experience SDK", "index.html#section_main", [ [ "At a Glance", "index.html#section_glance", [ [ "Software Stack", "index.html#section_stack", null ], diff --git a/doc/html/search/all_2.js b/doc/html/search/all_2.js index 2e19255..b0fda36 100644 --- a/doc/html/search/all_2.js +++ b/doc/html/search/all_2.js @@ -1,5 +1,6 @@ var searchData= [ ['defaultlocale',['defaultLocale',['../struct_n_v_g_s_d_k___highlight_config_params.html#a7f4f852d4fe97048f20dcdcc401ab82b',1,'NVGSDK_HighlightConfigParams']]], - ['destroyhighlights',['destroyHighlights',['../struct_n_v_g_s_d_k___highlight_close_group_params.html#a3d7eae61163c4616a42569ca8d7785c6',1,'NVGSDK_HighlightCloseGroupParams']]] + ['destroyhighlights',['destroyHighlights',['../struct_n_v_g_s_d_k___highlight_close_group_params.html#a3d7eae61163c4616a42569ca8d7785c6',1,'NVGSDK_HighlightCloseGroupParams']]], + ['development_20guide',['Development Guide',['../index.html',1,'']]] ]; diff --git a/doc/html/search/all_9.js b/doc/html/search/all_9.js index 1518243..1da4ac4 100644 --- a/doc/html/search/all_9.js +++ b/doc/html/search/all_9.js @@ -1,6 +1,5 @@ var searchData= [ - ['overview',['Overview',['../index.html',1,'']]], ['open',['open',['../struct_n_v_g_s_d_k___overlay_state_changed_notification.html#ad9684c86b575f710bcc784942e6bf256',1,'NVGSDK_OverlayStateChangedNotification']]], ['opengroupasync',['OpenGroupAsync',['../class_gfe_s_d_k_1_1_highlights.html#ab1b35bd4fe9e8aac357db3aeabfefa1b',1,'GfeSDK::Highlights::OpenGroupAsync()'],['../class_gfe_s_d_k_1_1_highlights_impl.html#a8420e07f1812fba8bf961e90e5795d3b',1,'GfeSDK::HighlightsImpl::OpenGroupAsync()']]], ['opensummaryasync',['OpenSummaryAsync',['../class_gfe_s_d_k_1_1_highlights.html#a9d1ab59542571efe90391aea1503411b',1,'GfeSDK::Highlights::OpenSummaryAsync()'],['../class_gfe_s_d_k_1_1_highlights_impl.html#ab31f1319b9dcf33cf9146916f8a1d5f3',1,'GfeSDK::HighlightsImpl::OpenSummaryAsync()']]], diff --git a/doc/html/search/pages_1.js b/doc/html/search/pages_1.js index 277cca0..8ccb486 100644 --- a/doc/html/search/pages_1.js +++ b/doc/html/search/pages_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['overview',['Overview',['../index.html',1,'']]] + ['development_20guide',['Development Guide',['../index.html',1,'']]] ]; diff --git a/doc/html/search/searchdata.js b/doc/html/search/searchdata.js index 9dbaa1a..78cf9fe 100644 --- a/doc/html/search/searchdata.js +++ b/doc/html/search/searchdata.js @@ -8,7 +8,7 @@ var indexSectionsWithContent = 5: "n", 6: "n", 7: "n", - 8: "co" + 8: "cd" }; var indexSectionNames = |