structure D3DHAL_DP2TEXBLT (d3dhal.h)
La structure D3DHAL_DP2TEXBLT est utilisée pour les blts de texture lorsque D3dDrawPrimitives2 répond au jeton de commande D3DDP2OP_TEXBLT.
Syntaxe
typedef struct _D3DHAL_DP2TEXBLT {
DWORD dwDDDestSurface;
DWORD dwDDSrcSurface;
POINT pDest;
RECTL rSrc;
DWORD dwFlags;
} D3DHAL_DP2TEXBLT;
Membres
dwDDDestSurface
Spécifie le handle de la texture de destination.
dwDDSrcSurface
Spécifie le handle de la texture source.
pDest
Spécifie le point de destination où le blt doit être effectué, c’est-à-dire le point dans la surface de destination (dwDDDestSurface) pour commencer le blt. Ces membres x et y de la structure POINT sont spécifiés dans les coordonnées d’écran.
rSrc
Spécifie le rectangle à fente dans la texture source, c’est-à-dire le rectangle source dans la surface source (dwDDSrcSurface) à partir de laquelle blt.
dwFlags
Réservé pour le système.
Remarques
Le rappel D3dCreateSurfaceEx crée les petites poignées entières pour les textures qui peuvent être utilisées comme textures source et de destination pour les blts de texture.
La structure D3DHAL_DP2TEXBLT est utilisée avec un jeton de flux de commandes D3DDP2OP_TEXBLT pour informer les pilotes d’effectuer une opération blt d’une texture source vers une texture de destination. Une texture peut également être une carte d’environnement cubique. Le pilote doit copier un rectangle spécifié par rSrc dans la texture source vers l’emplacement spécifié par pDest dans la texture de destination. Les textures de destination et source sont identifiées par des handles dont le pilote a été averti au moment de la création de la texture. Si le pilote est capable de gérer les textures, il est possible que le handle de destination soit 0. Cela indique au pilote qu’il doit précharger la texture dans la mémoire vidéo (ou là où le matériel texture efficacement). Dans ce cas, le pilote peut ignorer rSrc et pDest.
Notez que pour les textures mappées MIP, une seule instruction D3DDP2OP_TEXBLT est insérée dans le flux de commandes D3dDrawPrimitives2 . Dans ce cas, le pilote doit blt tous les niveaux de carte MIP présents dans la texture. Les régions à copier dans les sous-niveaux de carte MIP peuvent être obtenues en divisant rSrc etpDest par 2 à chaque niveau.
Il est possible que les textures source et de destination contiennent différents nombres de niveaux de carte MIP. Dans ce cas, le pilote doit blter les niveaux communs. Par exemple, si une texture source 256x256 a 8 niveaux de carte MIP et si la destination est une texture 64x64 avec 6 niveaux, le pilote doit bler les 6 niveaux correspondants à partir de la source. Le pilote peut s’attendre à ce que les dimensions du niveau MIP supérieur de la texture de destination soient toujours inférieures ou égales aux dimensions du niveau MIP supérieur de la texture source.
Notez que les handles source et destination font toujours référence aux surfaces de niveau supérieur et jamais aux sous-niveaux de mappage MIP. En raison d’une erreur dans l’application, il est possible que la texture de destination contienne des niveaux de mappage MIP supplémentaires. Par exemple, une texture source 256x256 peut contenir cinq niveaux, mais la texture de destination 256x256 peut en contenir huit. Le pilote est censé gérer ce cas en toute sécurité, mais il n’est pas censé produire des résultats corrects. En raison de problèmes de compatibilité des applications héritées, Direct3D n’empêche pas ces paires de textures source/destination d’être transmises au pilote.
Le pilote peut s’attendre à ce que les formats de pixels des textures source et de destination soient identiques et, en général, que le blt spécifié est sécurisé. En dehors du cas unique mentionné ci-dessus, le conducteur ne doit pas s’attendre à être confronté à une situation qui rend impossible l’exécution d’un blt.
Si le pilote souhaite effectuer des blts asynchrones de la mémoire système à la mémoire vidéo, il doit implémenter l’appel DirectDraw HAL GetSysmemBltStatus. Sinon, des incohérences peuvent survenir.
Avec TexBlt, il n’est pas nécessaire que le pilote effectue une synchronisation, car les TexBlts sont toujours émis dans le bon ordre avec les commandes de rendu. Avant cela, il était nécessaire que le pilote gère correctement le cas lorsqu’un blt DirectDraw modifie une texture référencée par des commandes de rendu dans n’importe quel contexte Direct3D. Lorsque plusieurs contextes sont présents, Direct3D n’émet pas de TexBlts. Cela signifie que l’enregistreur de pilotes peut omettre le code de synchronisation dans le chemin de code TexBlt (mais a toujours besoin d’une synchronisation pour les blts).
Exemple
Le pseudocode suivant montre comment une sous-correction doit être calculée pour les niveaux MIP consécutifs, pour passer au niveau MIP i + 1 à partir du niveau MIP i :
rect.left >>= 1;
rect.top >>= 1;
DWORD right = (rect.right + 1) >> 1;
DWORD bottom = (rect.bottom + 1) >> 1;
rect.right = ((right - rect.left) < 1) ?
(rect.left + 1) : (right);
rect.bottom = ((bottom - rect.top ) < 1) ?
(rect.top + 1) : (bottom);
Configuration requise
Condition requise | Valeur |
---|---|
En-tête | d3dhal.h (inclure D3dhal.h) |
Voir aussi
D3DDP2OP_TEXBLT