|
我在另一个线程里 修改了 texture的数据,用lockRect锁住改的。
lock();
D3DLOCKED_RECT d3dlr;
{
if (FAILED(m_pTexture->LockRect(0, &d3dlr, 0, 0)))
{
unlock();
return E_FAIL;
}
}
for( row = 0; row< (UINT)m_lVidHeight; row++)
{
pdwS = ( DWORD*)pBmpBuffer;
pdwD = ( DWORD*)pTxtBuffer;
for( col = 0; col < dwordWidth; col ++ )
{
pdwD[0] = pdwS[0] | 0xFF000000;
pdwD[1] = ((pdwS[1]<<8) | 0xFF000000) | (pdwS[0]>>24);
pdwD[2] = ((pdwS[2]<<16) | 0xFF000000) | (pdwS[1]>>16);
pdwD[3] = 0xFF000000 | (pdwS[2]>>8);
pdwD +=4;
pdwS +=3;
}
}
unlock();
和主渲染线程同步控制的 用了 Mute,
void render()
{
video_rest.myDShow2texture.lock();
V( g_pd3dDevice->BeginScene() ) ;
drawFullTex(video_rest.myDShow2texture.getVideoTexture());
V( g_pd3dDevice->EndScene() );
video_rest.myDShow2texture.unlock();
}
void CTextureRenderer::lock()
{
DWORD dw = WaitForSingleObject(textureMutex, 1000);
if(dw == WAIT_TIMEOUT || dw == WAIT_FAILED) ASSERT(false);
}
void CTextureRenderer::unlock()
{
ReleaseMutex(textureMutex);
}
测试下来,一个问题,在xp下没问题,换到win7下程序偶尔会僵死。
难道win7在directx9做了什么手脚?
另外锁的位置我也不确定,是不是要在 present 之后 , 还是 到 V( g_pd3dDevice->EndScene() );之后。还是DrawPraviateup就可以解锁了? |
|