2016-11-11 1 views
1

J'ai un identifiant pour ID3D11Texture2D, mais pas d'accès à ID3D11DeviceContext ou ID3D11Device. Je veux copier cette texture à l'autre texture sur l'autre ID3D11Device. La texture n'est créée avec aucun indicateur de partage. Si j'essaie de copier avec ID3D11DeviceContext :: CopyResource je reçois un avertissement "Le paramètre CORRUPTION D3D11 ne correspond pas au périphérique". Comment puis-je copier la texture ou son contenu? Je suppose que c'est possible, car par exemple OpenVR API utilise uniquement le handle de texture sans aucun contexte.Copie de la texture Direct3D11 sur un autre périphérique D3D11

+0

Si vous n'utilisez pas le partage, vous devez le recopier via une mémoire CPU qui va être terriblement lente. –

+0

@ChuckWalbourn Pour copier la texture dans le processeur, il faudrait que je la copie d'abord dans la texture de transfert. Et pour ce faire, j'aurais besoin d'un contexte d'appareil que je n'ai pas? – superg

+0

Vous ne pouvez pas effectuer de copie sans le contexte de périphérique immédiat. –

Répondre

2

Si une texture n'est pas créée avec le drapeau de partage, vous ne pouvez pas l'utiliser entre deux périphériques.

Mais vous avez l'objet de texture, qui est un ID3D11DeviceChild et il suffit d'avoir accès à ID3D11DeviceChild::GetDevice pour récupérer l'appareil et par extension ID3D11Device::GetImmediateContext

Maintenant que vous avez accès à l'appareil et le contexte, vous pouvez créer une texture supplémentaire avec le drapeau de partage D3D11_RESOURCE_MISC_SHARED sur l'appareil d'origine ou le vôtre et récupérer l'objet sur l'autre avec ID3D11Device::OpenSharedResource. Et enfin copier la texture originale sur le nouvel objet avec CopyResource

N'oubliez pas que toutes les thèses Get ajouter une référence aux objets qui doivent être libérés une fois que vous avez terminé avec eux.

+1

Fonctionne comme un charme et résout parfaitement mon problème. Merci beaucoup! – superg