2011-04-07 2 views
3

공유 리소스를 사용하여 하나의 D3D11 장치에서 다른 장치로 텍스처를 전송하므로 두 번째 장치에서 백 버퍼를 복사하고 두 번째 장치 컨텍스트를 사용하여 해당 텍스처를 파일에 저장할 수 있습니다. 이것은 효과가있는 것처럼 보이지만 텍스처를 저장할 때 비어있는 PNG를 저장합니다. 리소스를 공유하기 위해 필요한 D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX MiscFlag를 사용하는 경우를 제외하고는 기본 장치 컨텍스트로 텍스처를 저장하려고 시도했지만 작동합니다. D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX가 텍스처가 저장되는 것을 막는 어떤 이유가 있습니까? 아니면 작동시키기 위해 뭔가를 놓친 것일까 요? 여기 공유 리소스가있는 D3DX11SaveTextureToFile

내가 사용하고 코드입니다 :

D3D11_TEXTURE2D_DESC td; 
backBuffer->GetDesc(&td); 
td.MiscFlags = D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX; 
this->_device->CreateTexture2D(&td, 0, &g_tex); 
this->_context->CopyResource(g_tex, backBuffer); 

// saves a blank image if using D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX 
D3DX11SaveTextureToFile(this->_context, g_tex, D3DX11_IFF_JPG, "test.jpg"); 

g_tex->QueryInterface(__uuidof(IDXGIResource), reinterpret_cast<void **>(&g_dxgiResource)); 
g_dxgiResource->GetSharedHandle(&g_shaderHandle); 
g_dxgiResource->Release(); 
g_tex->QueryInterface(__uuidof(IDXGIKeyedMutex), reinterpret_cast<void **>(&g_dxgiMutex)); 

그리고이 두 번째 장치 또한

ID3D11Texture2D *texture = 0; 
IDXGIKeyedMutex *keyedMutex = 0; 
device2->OpenSharedResource(g_shaderHandle, __uuidof(ID3D11Texture2D), reinterpret_cast<void **>(&texture)); 
texture->QueryInterface(__uuidof(IDXGIKeyedMutex), reinterpret_cast<void **>(&keyedMutex)); 
UINT acqKey = 0; 
UINT relKey = 1; 
DWORD timeout = 16; 
DWORD res = keyedMutex->AcquireSync(acqKey, timeout); 
if (res == WAIT_OBJECT_0 && texture) 
{ 
    // saves a blank image too 
    D3DX10SaveTextureToFile(texture, D3DX10_IFF_JPG, "test2.jpg"); 
} 
keyedMutex->ReleaseSync(relKey); 

에서 공유 여는 textue을 저장하는 데 사용되는 코드로 가정되는 코드 자신의 스레드에서 실행중인 파일 시스템에 공유 텍스처를 저장하십시오.

답변

4

다음은 문제를 해결 한 방법입니다. D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX의 misc 플래그를 사용해, 텍스처를 파일에 보존 할 수없는 것을 나타냅니다. 그래서 DXGIKeyedMutex를 사용하지 않고 일반 뮤텍스 대신 D3D11_RESOURCE_MISC_SHARED 플래그를 사용했습니다.

복사 공유 질감에 백 버퍼 및 공유 핸들 작성 : 이제 우리는 백 버퍼의 공유 복사본을 가지고 그것을 처리 할 것을

D3D11_TEXTURE2D_DESC td; 
backBuffer->GetDesc(&td); 
td.MiscFlags = D3D11_RESOURCE_MISC_SHARED; 

this->_device->CreateTexture2D(&td, 0, &g_tex); 
this->_context->CopyResource(g_tex, backBuffer); 
IDXGIResource *dxgiResource = 0; 
g_tex->QueryInterface(__uuidof(IDXGIResource), reinterpret_cast<void **>(&dxgiResource)); 
dxgiResource->GetSharedHandle(&g_shaderHandle); 
dxgiResource->Release(); 
backBuffer->Release(); 

을, 우리는 다른 스레드에서 파일에 저장할 수 있습니다 장치 컨텍스트를 독차지하지 않고 :

// device_2 and context_2 are the "secondary" device and context 
bool imgSaved = true; 
ID3D11Texture2D *texture = 0; 
HRESULT h = WaitForSingleObject(g_mutex, INFINITE); 
if (h == WAIT_OBJECT_0) 
{ 
    // check to see if there is an image to save 
    if (wdata->hasFrame) 
    { 
     wdata->hasFrame = false; 
     imgSaved = false 
    } 
} 
ReleaseMutex(g_mutex); 
if (!imgSaved) 
{ 
    device_2->OpenSharedResource(g_shaderHandle, __uuidof(ID3D11Texture2D), (LPVOID*)&texture); 
    if (texture) 
    { 
     h = D3DX11SaveTextureToFile(context_2, texture, D3DX11_IFF_PNG, "image.png"); 
     texture->Release(); 
    } 
} 

는 기본적으로이 날 HD 화면 내 장치 컨텍스트가 D3DX11SaveTextureToFile 기능에 갇혀 있지 않기 때문에 프레임 속도를 죽이지 않고 캡처 저장할 수 있습니다, 그것은 2 차 문맥에 의해 처리합니다. 한마디로, 나는 그것을 많이 테스트하지는 않았지만, 오늘 아침에 함께 해킹했을 때, 어떤 경우에는 작동하지 않을 수도 있지만, 다른 플래그와 관련된 문제가 해결되어 빈 이미지가 생겼다. 파일에 저장되었습니다.

0

backBuffer를 소유 한 _device에서 CreateTexture2D 및 CopyResource를 더 논리적으로 사용할 수 없습니까?

+0

그게 내가하고있는 일이야. – dotminic

관련 문제