XGameStreamingGetAssociatedFrame

Gets the frame pipeline token from a specific input reading.

Syntax

HRESULT XGameStreamingGetAssociatedFrame(  
         IGameInputReading* gamepadReading,  
         D3D12XBOX_FRAME_PIPELINE_TOKEN* framePipelineToken  
)  

Parameters

gamepadReading   _In_
Type: IGameInputReading*

The gamepad reading that is being queried.

framePipelineToken   _Out_
Type: D3D12XBOX_FRAME_PIPELINE_TOKEN*

The frame pipeline token associated with the frame that was displayed on the client's device when the input was taken by the player. This pipeline token corresponds to the PresentX call when it was presented by the game and sent to the client device.

Return value

Type: HRESULT

Returns S_OK if successful; otherwise, returns an error code.

Potential Errors

Error Code Error Value Reason for Error
E_GAMESTREAMING_NOT_INITIALIZED 0x89245400 The XGameStreaming runtime has not been initialized. Call XGameStreamingInitialize before calling other APIs.
E_GAMESTREAMING_NO_DATA 0x89245402 The requested data is not available. The data may be available later.
E_GAMESTREAMING_NOT_STREAMING_CONTROLLER 0x89245404 The current reading didn't come from a streaming controller.

Remarks

When a player is streaming a game, XGameStreamingGetAssociatedFrame can be utilized if the game needs to change game behavior based upon what particular frame was displayed on the players's device when the input was taken.

This would allow the game to make its simulation decisions based on the frame that the player saw at time of input, not the current one.

XGameStreamingGetAssociatedFrame can only provide information for the game about the frame being displayed when a new input reading is created. In the case where the game needs to determine what was being displayed when an input may not have been done by the player, the game should utilize XGameStreamingGetLastFrameDisplayed.

Example

// In this example, when processing input, the game would like to pass along the frame 
// that was being displayed to the player at the time of input so that their simulation
// engine can take that into account.

// The framePipelineToken was initially captured at the callback of WaitFrameEventX

void Game::Update(DX::StepTimer const& timer)
{
    IGameInputReading* reading;
    if (SUCCEEDED(g_gameInput->GetCurrentReading(GameInputKindGamepad, g_gamepad, &reading)))
    {
        D3D12XBOX_FRAME_PIPELINE_TOKEN framePipelineToken = D3D12XBOX_FRAME_PIPELINE_TOKEN_NULL;        

        if SUCCEEDED(XGameStreamingGetAssociatedFrame(&reading, &framePipelineToken)) 
        {
            SimulateBasedOnInputAndFrameDisplayed(reading, framePipelineToken);
        }
        else 
        {
            // simulate based on current frame
            SimulateBasedOnInput(reading);
        }

        reading->Release();
    }
}

Requirements

Header: xgamestreaming.h

Library: xgameruntime.lib

Supported platforms: Windows, Xbox One family consoles and Xbox Series consoles

See also

XGameStreamingGetLastFrameDisplayed
XGameStreaming
Game Streaming Latency Compensation Overview