> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# SetShaderScratchSpaceX (consoles XBOX Series)

> Permet de contrôler directement les registres SPI_TMPRING_SIZE et COMPUTE_TMPRING_SIZE et, respectivement, les anneaux graphiques et de calcul.

Permet de contrôler directement les registres SPI\_TMPRING\_SIZE et COMPUTE\_TMPRING\_SIZE et, respectivement, les anneaux graphiques et de calcul.

## Syntaxe

```cpp theme={null}
void SetShaderScratchSpaceX(  
         D3D12XBOX_SET_SHADER_SCRATCH_SPACE_FLAGS Flags,  
         D3D12_GPU_VIRTUAL_ADDRESS Destination,  
         UINT64 SizeBytes,  
         UINT SizePerWaveInBytes  
)  
```

### Paramètres

*Flags*   \_In\_\
Type : [D3D12XBOX\_SET\_SHADER\_SCRATCH\_SPACE\_FLAGS](/fr-CA/reference/graphics/d3d12_xs/enums/d3d12xbox_set_shader_scratch_space_flags_xs)

Choisissez le calcul, les graphiques ou les deux.

*Destination*   \_In\_\
Type : D3D12\_GPU\_VIRTUAL\_ADDRESS

Adresse de base de l'espace de travail; doit être alignée sur 1 Ko ou nulle. Définir cette valeur à null reprogramme les valeurs par défaut actuellement définies par le pilote.

*SizeBytes*   \_In\_\
Type : UINT64

Taille de l'espace de travail, alignée sur 1 Ko; doit être 0 si l'adresse est nulle.

*SizePerWaveInBytes*   \_In\_\
Type : UINT

Taille de l'espace de travail par vague; doit être alignée sur 1 Ko, doit être inférieure ou égale à la taille totale de l'espace de travail et doit être 0 si l'adresse est nulle.

### Valeur renvoyée

Type : void

## Remarques

Notre matériel prend en charge les modifications en pipeline des registres tmpring\_size, mais un vidage complet du pipeline est nécessaire lorsque l'adresse mémoire sous-jacente de l'espace de travail est réutilisée. Il en découle ce qui suit : par défaut, le pilote graphique alloue un seul espace de travail pour les graphiques et le calcul et définit les registres tmpring\_size de façon à ne pouvoir accueillir que quelques vagues par SIMD. Cela signifie que l'occupation est faible lorsque la mémoire de travail est activée dans les nuanceurs. Par défaut, puisqu'il n'existe qu'une seule allocation de calcul, le calcul asynchrone ne peut pas être utilisé simultanément avec le calcul graphique, ce qui signifie que les nuanceurs utilisant de la mémoire de travail ne peuvent pas du tout être utilisés en calcul asynchrone. Les développeurs peuvent remplacer les tailles de mémoire de travail au moyen de l'API spécialisée de création d'appareil XBOX, mais ne peuvent pas remplacer ce comportement.

Cette API permet de reprogrammer ce comportement par défaut afin d'obtenir une occupation plus élevée et un chevauchement du travail en graphiques et en calcul asynchrone. Aucune synchronisation n'est effectuée en interne et aucune vérification des pointeurs mémoire n'est faite pour éviter leur réutilisation; il est donc très important que les utilisateurs implémentent leur propre synchronisation afin de s'assurer qu'aucune mémoire n'est réutilisée lorsque le registre tmpring\_size est reprogrammé.

Il est possible d'interroger la taille de mémoire de travail requise par vague à l'aide des API suivantes

```cpp theme={null}
UINT GetScratchSize(
    ID3D12PipelineState* pPso)
{
    ComPtr<ID3DBlob> blob;

    // Retrieve scratch size, if present
    HRESULT hr = pPso->GetInformationX(D3D12XBOX_PIPELINE_STATE_INFORMATION_TYPE_SCRATCH_SIZE_PER_WAVE_IN_UNITS_OF_256DW, 0, &blob);
    if (FAILED(hr))
        return 0;

    const UINT* pValue = (UINT*)blob->GetBufferPointer();

    return *pValue * 1024;
}
```

Voici un exemple de la façon dont elle peut être définie, en permettant par exemple à 8 vagues de partager l'espace de travail (notez qu'en pratique, c'est trop peu de vagues)

```cpp theme={null}
    const UINT scratchSizePerWaveBytes = GetScratchSize(pso.Get());
    const UINT scratchSize = scratchSizePerWaveBytes * 8;

    pCmdList->SetShaderScratchSpaceX(D3D12XBOX_SET_SHADER_SCRATCH_SPACE_FLAGS_GRAPHICS,
        pScratch0->GetGPUVirtualAddress(),
        scratchSize,
        scratchSizePerWaveBytes);
    pCmdList->SetPipelineState(pso.Get());
    pCmdList->DrawInstanced(128, 1, 0, 0);
```

Enfin, le matériel ne prend pas en charge une occupation supérieure à 16 lorsque SCRATCH\_EN est activé, car la programmation de tmpring\_size ne permet pas de spécifier plus de 32 vagues par unité de calcul.

## Configuration requise

**En-tête :** d3d12\_xs.h

**Bibliothèque :** d3d12\_xs.lib

**Plateformes prises en charge** : XBOX Series X|S

## Voir aussi

[ID3D12GraphicsCommandList6](/fr-CA/reference/graphics/d3d12_xs/interfaces/ID3D12GraphicsCommandList6/id3d12graphicscommandlist6)


## Related topics

- [Répertoire des rubriques NDA : liens actifs vers Microsoft Learn](/fr-CA/nda/nda-topic-directory.md)
- [Page Scratch](/fr-CA/tools/tools-console/wdp/windows-device-portal-on-xbox-scratch.md)
- [ShaderCacheControl (consoles XBOX Series)](/fr-CA/reference/graphics/d3d12/interfaces/id3d12device9/methods/id3d12device9_shadercachecontrol_public.md)
- [GetShaderStackSize (consoles XBOX Series)](/fr-CA/reference/graphics/d3d12/interfaces/id3d12stateobjectproperties/methods/id3d12stateobjectproperties_getshaderstacksize_public.md)
- [SetGraphicsRootShaderResourceView](/fr-CA/reference/graphics/d3d12/interfaces/id3d12graphicscommandlist/methods/id3d12graphicscommandlist_setgraphicsrootshaderresourceview_public.md)
