다음을 통해 공유


PFND3D10DDI_RESOURCEMAP 콜백 함수(d3d10umddi.h)

ResourceMap 함수는 리소스의 하위 리소스를 매핑합니다.

구문

PFND3D10DDI_RESOURCEMAP Pfnd3d10ddiResourcemap;

void Pfnd3d10ddiResourcemap(
  D3D10DDI_HDEVICE unnamedParam1,
  D3D10DDI_HRESOURCE unnamedParam2,
  UINT unnamedParam3,
  D3D10_DDI_MAP unnamedParam4,
  UINT unnamedParam5,
  D3D10DDI_MAPPED_SUBRESOURCE *unnamedParam6
)
{...}

매개 변수

unnamedParam1

hDevice [in]

디스플레이 디바이스(그래픽 컨텍스트)에 대한 핸들입니다.

unnamedParam2

hResource [in]

매핑할 리소스에 대한 핸들입니다.

unnamedParam3

하위 리소스 [in]

매핑할 하위 리소스를 나타내는 인덱스입니다.

unnamedParam4

DDIMap [in]

하위 리소스를 매핑할 액세스 수준을 나타내는 D3D10_DDI_MAP 형식의 값입니다.

unnamedParam5

Flags [in]

하위 리소스를 매핑하는 방법을 나타내는 D3D10_DDI_MAP_FLAG 형식의 값입니다.

unnamedParam6

pMappedSubResource [out]

매핑된 하위 리소스에 대한 정보를 수신하는 D3D10DDI_MAPPED_SUBRESOURCE 구조체에 대한 포인터입니다.

반환 값

없음

설명

드라이버는 pfnSetErrorCb 콜백 함수를 사용하여 오류 코드를 설정할 수 있습니다.

드라이버는 pfnSetErrorCb 를 호출하여 D3DDDIERR_DEVICEREMOVED 오류 코드를 설정할 수 있습니다.

일반적으로 런타임이 D3DDDIERR_DEVICEREMOVED 오류 코드를 수신한 직후 런타임은 더 이상 사용자 모드 표시 드라이버(바인딩 해제, 삭제 및 기타 정리 작업 제외)를 호출하지 않습니다.

일반적으로 사용자 모드 표시 드라이버의 ResourceMap 함수에 대한 각 호출은 드라이버의 ResourceUnmap 함수에 대한 호출과 함께 제공됩니다. 그러나 런타임이 D3DDDIERR_DEVICEREMOVED 오류 코드를 받은 후에는 ResourceUnmap을 호출하지 않습니다.

런타임이 Flags 매개 변수의 D3D10_DDI_MAP_FLAG_DONOTWAIT 플래그를 통과한 경우 드라이버는 pfnSetErrorCb 를 호출하여 DXGI_DDI_ERR_WASSTILLDRAWING 오류 코드를 설정할 수 있습니다.

드라이버는 스위치 문을 포함할 수 있는 ResourceMapResourceUnmap 함수 한 쌍을 구현하여 다양한 기능을 처리할 수 있습니다. 즉, 드라이버는 하나의 ResourceMap-ResourceUnmap 쌍을 구현할 수 있으며 이 구현 쌍을 가리키도록 D3D10DDI_DEVICEFUNCS 구조체의 다음 멤버를 설정할 수 있습니다.

  • pfnDynamicIABufferMapDiscard-pfnDynamicIABufferUnmap

  • pfnDynamicIABufferMapNoOverwrite-pfnDynamicIABufferUnmap

  • pfnDynamicConstantBufferMapDiscard-pfnDynamicConstantBufferUnmap

  • pfnDynamicResourceMapDiscard-pfnDynamicResourceUnmap

  • pfnStagingResourceMap-pfnStagingResourceUnmap

그러나 성능을 향상시키기 위해 드라이버는 별도의 map-unmap 함수 쌍을 구현할 수 있습니다. Microsoft Direct3D 런타임은 리소스 종류(예: 버퍼 또는 텍스처) 및 리소스를 만들고 매핑할 때 지정된 D3D10_DDI_RESOURCE_USAGE, D3D10_DDI_RESOURCE_BIND_FLAGD3D10_DDI_MAP 값의 형식에 따라 적절한 map-unmap 함수 쌍을 호출합니다.

참고

매핑 및 매핑 해제할 리소스 유형이 버퍼인 경우 Direct3D 런타임은 Subresource 매개 변수를 0으로 설정합니다.
Direct3D 런타임은 일반적으로 동적 텍스처에 대해 pfnDynamicResourceMapDiscard-pfnDynamicResourceUnmap 함수 쌍을 호출하지만 런타임은 D3D10_DDI_BIND_SHADER_RESOURCE 바인딩 플래그 집합을 사용하여 만든 동적 버퍼에 대해 이 함수 쌍을 호출합니다.

다음 예제 코드는 Direct3D 런타임이 특정 맵 또는 매핑 해제 함수를 호출할 때 설정된 값을 보여 옵니다.

//-----------------------------------------------
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 );
}

입력 값에 대한 제한 사항

WDDM(Windows 디스플레이 드라이버 모델) 1.3 이상 드라이버의 경우 Microsoft Direct3D 런타임은 이 함수에서 사용하는 제한된 입력 값 집합을 제공합니다. 제한된 모든 값 목록은 Direct3D 렌더링 성능 향상을 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Vista 이상 버전의 Windows 운영 체제에서 사용할 수 있습니다.
대상 플랫폼 데스크톱
머리글 d3d10umddi.h(D3d10umddi.h 포함)

추가 정보

D3D10DDI_DEVICEFUNCS

D3D10DDI_MAPPED_SUBRESOURCE

D3D10_DDI_MAP

D3D10_DDI_MAP_FLAG

D3D10_DDI_RESOURCE_BIND_FLAG

D3D10_DDI_RESOURCE_USAGE

ResourceUnmap

pfnSetErrorCb