PFND3D10DDI_RESOURCEMAP função de retorno de chamada (d3d10umddi.h)
A função ResourceMap mapeia um sub-recurso de um recurso.
Sintaxe
PFND3D10DDI_RESOURCEMAP Pfnd3d10ddiResourcemap;
void Pfnd3d10ddiResourcemap(
D3D10DDI_HDEVICE unnamedParam1,
D3D10DDI_HRESOURCE unnamedParam2,
UINT unnamedParam3,
D3D10_DDI_MAP unnamedParam4,
UINT unnamedParam5,
D3D10DDI_MAPPED_SUBRESOURCE *unnamedParam6
)
{...}
Parâmetros
unnamedParam1
hDevice [in]
Um identificador para o dispositivo de exibição (contexto gráfico).
unnamedParam2
hResource [in]
Um identificador para o recurso a ser mapeado.
unnamedParam3
Sub-recurso [in]
Um índice que indica o sub-recurso a ser mapeado.
unnamedParam4
DDIMap [in]
Um valor do tipo D3D10_DDI_MAP que indica o nível de acesso para o qual mapear o sub-recurso.
unnamedParam5
Sinalizadores [in]
Um valor do tipo D3D10_DDI_MAP_FLAG que indica como mapear o sub-recurso.
unnamedParam6
pMappedSubResource [out]
Um ponteiro para uma estrutura D3D10DDI_MAPPED_SUBRESOURCE que recebe as informações sobre o sub-recurso mapeado.
Retornar valor
Nenhum
Comentários
O driver pode usar a função de retorno de chamada pfnSetErrorCb para definir um código de erro.
O driver pode chamar pfnSetErrorCb para definir o código de erro D3DDDIERR_DEVICEREMOVED.
Normalmente, imediatamente após o runtime receber o código de erro D3DDDIERR_DEVICEREMOVED, o runtime não chamará mais o driver de exibição do modo de usuário por muito tempo (exceto para desassociar, destruir e outras operações de limpeza).
Normalmente, cada chamada para a função ResourceMap do driver de exibição no modo de usuário é acompanhada de uma chamada para a função ResourceUnmap do driver; no entanto, depois que o runtime receber o código de erro D3DDDIERR_DEVICEREMOVED, ele não chamará ResourceUnmap.
Se o runtime passou o sinalizador D3D10_DDI_MAP_FLAG_DONOTWAIT no parâmetro Flags , o driver poderá chamar pfnSetErrorCb para definir o código de erro DXGI_DDI_ERR_WASSTILLDRAWING.
O driver pode implementar um par de funções ResourceMap e ResourceUnmap que podem conter instruções switch para processar várias funcionalidades. Ou seja, o driver pode implementar um par ResourceMap-ResourceUnmap e pode definir os seguintes membros da estrutura D3D10DDI_DEVICEFUNCS para apontar para esse par de implementação:
pfnDynamicIABufferMapDiscard-pfnDynamicIABufferUnmap
pfnDynamicIABufferMapNoOverwrite-pfnDynamicIABufferUnmap
pfnDynamicConstantBufferMapDiscard-pfnDynamicConstantBufferUnmap
pfnDynamicResourceMapDiscard-pfnDynamicResourceUnmap
pfnStagingResourceMap-pfnStagingResourceUnmap
No entanto, para melhorar o desempenho, o driver pode implementar pares de função map-unmap separados. O runtime do Microsoft Direct3D chama o par de funções map-unmap apropriado dependendo do tipo de recurso (por exemplo, um buffer ou textura) e do tipo de D3D10_DDI_RESOURCE_USAGE, D3D10_DDI_RESOURCE_BIND_FLAG e D3D10_DDI_MAP valores especificados quando o recurso é criado e mapeado.
Observação
Se o tipo de recurso a ser mapeado e não mapeado for um buffer, o runtime do Direct3D definirá o parâmetro Subresource como zero.
Embora o runtime do Direct3D normalmente chame o par de funções pfnDynamicResourceMapDiscard-pfnDynamicResourceUnmap para texturas dinâmicas, o runtime também chama esse par de funções para buffers dinâmicos que foram criados com o conjunto de sinalizadores de associação D3D10_DDI_BIND_SHADER_RESOURCE.
O código de exemplo a seguir mostra os valores definidos quando o runtime do Direct3D chama o mapa específico ou a função unmap:
//-----------------------------------------------
void APIENTRY UMDevice::DynamicIABufferMapNoOverwrite_Default(
D3D10DDI_HDEVICE hDevice,
D3D10DDI_HRESOURCE hResource,
UINT Subresource,
D3D10_DDI_MAP MapType,
UINT MapFlags,
D3D10DDI_MAPPED_SUBRESOURCE* pMappedSubresource )
{
UMDevice* pThis = UMDevice::CastFrom( hDevice );
UMResource* pResource = UMResource::CastFrom( hResource );
assert( pResource->m_DDICreateResource.ResourceDimension == D3D10DDIRESOURCE_BUFFER &&
pResource->m_DDICreateResource.Usage == D3D10_DDI_USAGE_DYNAMIC &&
(pResource->m_DDICreateResource.BindFlags & (D3D10_DDI_BIND_VERTEX_BUFFER | D3D10_DDI_BIND_INDEX_BUFFER)) &&
!(pResource->m_DDICreateResource.BindFlags & ~(D3D10_DDI_BIND_VERTEX_BUFFER | D3D10_DDI_BIND_INDEX_BUFFER)) &&
Subresource == 0 &&
MapType == D3D10_DDI_MAP_WRITE_NOOVERWRITE &&
MapFlags == 0 );
pResource->Map( Subresource, MapType, MapFlags, pMappedSubresource );
}
//------------------------------------------------
void APIENTRY UMDevice::DynamicIABufferMapDiscard_Default(
D3D10DDI_HDEVICE hDevice,
D3D10DDI_HRESOURCE hResource,
UINT Subresource,
D3D10_DDI_MAP MapType,
UINT MapFlags,
D3D10DDI_MAPPED_SUBRESOURCE* pMappedSubresource )
{
UMDevice* pThis = UMDevice::CastFrom( hDevice );
UMResource* pResource = UMResource::CastFrom( hResource );
assert( pResource->m_DDICreateResource.ResourceDimension == D3D10DDIRESOURCE_BUFFER &&
pResource->m_DDICreateResource.Usage == D3D10_DDI_USAGE_DYNAMIC &&
(pResource->m_DDICreateResource.BindFlags & (D3D10_DDI_BIND_VERTEX_BUFFER | D3D10_DDI_BIND_INDEX_BUFFER)) &&
!(pResource->m_DDICreateResource.BindFlags & ~(D3D10_DDI_BIND_VERTEX_BUFFER | D3D10_DDI_BIND_INDEX_BUFFER)) &&
Subresource == 0 &&
MapType == D3D10_DDI_MAP_WRITE_DISCARD &&
MapFlags == 0 );
pResource->Map( Subresource, MapType, MapFlags, pMappedSubresource );
}
//------------------------------------------------
void APIENTRY UMDevice::DynamicIABufferUnmap_Default(
D3D10DDI_HDEVICE hDevice,
D3D10DDI_HRESOURCE hResource,
UINT Subresource )
{
UMDevice* pThis = UMDevice::CastFrom( hDevice );
UMResource* pResource = UMResource::CastFrom( hResource );
assert( pResource->m_DDICreateResource.ResourceDimension == D3D10DDIRESOURCE_BUFFER &&
pResource->m_DDICreateResource.Usage == D3D10_DDI_USAGE_DYNAMIC &&
(pResource->m_DDICreateResource.BindFlags & (D3D10_DDI_BIND_VERTEX_BUFFER | D3D10_DDI_BIND_INDEX_BUFFER)) &&
!(pResource->m_DDICreateResource.BindFlags & ~(D3D10_DDI_BIND_VERTEX_BUFFER | D3D10_DDI_BIND_INDEX_BUFFER)) &&
Subresource == 0 );
pResource->Unmap( Subresource );
}
//------------------------------------------------
void APIENTRY UMDevice::DynamicConstantBufferMapDiscard_Default(
D3D10DDI_HDEVICE hDevice,
D3D10DDI_HRESOURCE hResource,
UINT Subresource,
D3D10_DDI_MAP MapType,
UINT MapFlags,
D3D10DDI_MAPPED_SUBRESOURCE* pMappedSubresource )
{
UMDevice* pThis = UMDevice::CastFrom( hDevice );
UMResource* pResource = UMResource::CastFrom( hResource );
assert( pResource->m_DDICreateResource.ResourceDimension == D3D10DDIRESOURCE_BUFFER &&
pResource->m_DDICreateResource.Usage == D3D10_DDI_USAGE_DYNAMIC &&
(pResource->m_DDICreateResource.BindFlags & D3D10_DDI_BIND_CONSTANT_BUFFER) &&
!(pResource->m_DDICreateResource.BindFlags & ~D3D10_DDI_BIND_CONSTANT_BUFFER) &&
Subresource == 0 &&
MapType == D3D10_DDI_MAP_WRITE_DISCARD &&
MapFlags == 0 );
pResource->Map( Subresource, MapType, MapFlags, pMappedSubresource );
}
//------------------------------------------------
void APIENTRY UMDevice::DynamicConstantBufferUnmap_Default(
D3D10DDI_HDEVICE hDevice,
D3D10DDI_HRESOURCE hResource,
UINT Subresource )
{
UMDevice* pThis = UMDevice::CastFrom( hDevice );
UMResource* pResource = UMResource::CastFrom( hResource );
assert( pResource->m_DDICreateResource.ResourceDimension == D3D10DDIRESOURCE_BUFFER &&
pResource->m_DDICreateResource.Usage == D3D10_DDI_USAGE_DYNAMIC &&
(pResource->m_DDICreateResource.BindFlags & D3D10_DDI_BIND_CONSTANT_BUFFER) &&
!(pResource->m_DDICreateResource.BindFlags & ~D3D10_DDI_BIND_CONSTANT_BUFFER) &&
Subresource == 0 );
pResource->Unmap( Subresource );
}
//------------------------------------------------
void APIENTRY UMDevice::DynamicResourceMapDiscard_Default(
D3D10DDI_HDEVICE hDevice,
D3D10DDI_HRESOURCE hResource,
UINT Subresource,
D3D10_DDI_MAP MapType,
UINT MapFlags,
D3D10DDI_MAPPED_SUBRESOURCE* pMappedSubresource )
{
UMDevice* pThis = UMDevice::CastFrom( hDevice );
UMResource* pResource = UMResource::CastFrom( hResource );
assert( pResource->m_DDICreateResource.Usage == D3D10_DDI_USAGE_DYNAMIC &&
pResource->m_DDICreateResource.Subresources == 1 &&
Subresource == 0 &&
MapType == D3D10_DDI_MAP_WRITE_DISCARD &&
MapFlags == 0 );
pResource->Map( Subresource, MapType, MapFlags, pMappedSubresource );
}
//------------------------------------------------
void APIENTRY UMDevice::DynamicResourceUnmap_Default(
D3D10DDI_HDEVICE hDevice,
D3D10DDI_HRESOURCE hResource,
UINT Subresource )
{
UMDevice* pThis = UMDevice::CastFrom( hDevice );
UMResource* pResource = UMResource::CastFrom( hResource );
assert( pResource->m_DDICreateResource.Usage == D3D10_DDI_USAGE_DYNAMIC &&
pResource->m_DDICreateResource.Subresources == 1 &&
Subresource == 0 );
pResource->Unmap( Subresource );
}
//------------------------------------------------
void APIENTRY UMDevice::StagingResourceMap_Default(
D3D10DDI_HDEVICE hDevice,
D3D10DDI_HRESOURCE hResource,
UINT Subresource,
D3D10_DDI_MAP MapType,
UINT MapFlags,
D3D10DDI_MAPPED_SUBRESOURCE* pMappedSubresource )
{
UMDevice* pThis = UMDevice::CastFrom( hDevice );
UMResource* pResource = UMResource::CastFrom( hResource );
assert( pResource->m_DDICreateResource.Usage == D3D10_DDI_USAGE_STAGING &&
(MapType == D3D10_DDI_MAP_READ || MapType == D3D10_DDI_MAP_WRITE || MapType == D3D10_DDI_MAP_READWRITE) );
pResource->Map( Subresource, MapType, MapFlags, pMappedSubresource );
}
//------------------------------------------------
void APIENTRY UMDevice::StagingResourceUnmap_Default(
D3D10DDI_HDEVICE hDevice,
D3D10DDI_HRESOURCE hResource,
UINT Subresource )
{
UMDevice* pThis = UMDevice::CastFrom( hDevice );
UMResource* pResource = UMResource::CastFrom( hResource );
assert( pResource->m_DDICreateResource.Usage == D3D10_DDI_USAGE_STAGING );
pResource->Unmap( Subresource );
}
//------------------------------------------------
void APIENTRY UMDevice::ResourceMap_Default(
D3D10DDI_HDEVICE hDevice,
D3D10DDI_HRESOURCE hResource,
UINT Subresource,
D3D10_DDI_MAP MapType,
UINT MapFlags,
D3D10DDI_MAPPED_SUBRESOURCE* pMappedSubresource )
{
UMDevice* pThis = UMDevice::CastFrom( hDevice );
UMResource* pResource = UMResource::CastFrom( hResource );
assert( pResource->m_DDICreateResource.Usage != D3D10_DDI_USAGE_DYNAMIC &&
pResource->m_DDICreateResource.Usage != D3D10_DDI_USAGE_STAGING );
// Generally true; but allow last second change:
assert( false );
pResource->Map( Subresource, MapType, MapFlags, pMappedSubresource );
}
//------------------------------------------------
void APIENTRY UMDevice::ResourceUnmap_Default(
D3D10DDI_HDEVICE hDevice,
D3D10DDI_HRESOURCE hResource,
UINT Subresource )
{
UMDevice* pThis = UMDevice::CastFrom( hDevice );
UMResource* pResource = UMResource::CastFrom( hResource );
assert( pResource->m_DDICreateResource.Usage != D3D10_DDI
_USAGE_DYNAMIC &&
pResource->m_DDICreateResource.Usage != D3D10_DDI_USAGE_STAGING );
// Generally true; but allow last second change:
assert( false );
pResource->Unmap( Subresource );
}
Restrições em valores de entrada
Para drivers WDDM (Windows Display Driver Model) 1.3 e posteriores, o runtime do Microsoft Direct3D fornece um conjunto restrito de valores de entrada usados por essa função. Para obter uma lista de todos os valores restritos, consulte Melhorias de desempenho de renderização do Direct3D.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Disponível no Windows Vista e versões posteriores dos sistemas operacionais Windows. |
Plataforma de Destino | Área de Trabalho |
Cabeçalho | d3d10umddi.h (inclua D3d10umddi.h) |