Bug 614111: Clear and recreate VertexBuffer on device reset. r=jrmuizel a=blocking-beta8

This commit is contained in:
Bas Schouten 2010-11-23 17:24:39 +01:00
Родитель be479e9785
Коммит 1c4fe46fe9
2 изменённых файлов: 42 добавлений и 22 удалений

Просмотреть файл

@ -377,30 +377,10 @@ DeviceManagerD3D9::Init()
return false;
}
hr = mDevice->CreateVertexBuffer(sizeof(vertex) * 4,
D3DUSAGE_WRITEONLY,
0,
D3DPOOL_DEFAULT,
getter_AddRefs(mVB),
NULL);
if (FAILED(hr)) {
if (!CreateVertexBuffer()) {
return false;
}
vertex *vertices;
hr = mVB->Lock(0, 0, (void**)&vertices, 0);
if (FAILED(hr)) {
return false;
}
vertices[0].x = vertices[0].y = 0;
vertices[1].x = 1; vertices[1].y = 0;
vertices[2].x = 0; vertices[2].y = 1;
vertices[3].x = 1; vertices[3].y = 1;
mVB->Unlock();
hr = mDevice->SetStreamSource(0, mVB, 0, sizeof(vertex));
if (FAILED(hr)) {
return false;
@ -541,6 +521,8 @@ DeviceManagerD3D9::VerifyReadyForRendering()
for(unsigned int i = 0; i < mSwapChains.Length(); i++) {
mSwapChains[i]->Reset();
}
mVB->Release();
D3DPRESENT_PARAMETERS pp;
memset(&pp, 0, sizeof(D3DPRESENT_PARAMETERS));
@ -559,7 +541,7 @@ DeviceManagerD3D9::VerifyReadyForRendering()
return false;
}
if (FAILED(hr)) {
if (FAILED(hr) || !CreateVertexBuffer()) {
mDeviceWasRemoved = true;
LayerManagerD3D9::OnDeviceManagerDestroy(this);
return false;
@ -629,5 +611,37 @@ DeviceManagerD3D9::VerifyCaps()
return true;
}
bool
DeviceManagerD3D9::CreateVertexBuffer()
{
HRESULT hr;
hr = mDevice->CreateVertexBuffer(sizeof(vertex) * 4,
D3DUSAGE_WRITEONLY,
0,
D3DPOOL_DEFAULT,
getter_AddRefs(mVB),
NULL);
if (FAILED(hr)) {
return false;
}
vertex *vertices;
hr = mVB->Lock(0, 0, (void**)&vertices, 0);
if (FAILED(hr)) {
return false;
}
vertices[0].x = vertices[0].y = 0;
vertices[1].x = 1; vertices[1].y = 0;
vertices[2].x = 0; vertices[2].y = 1;
vertices[3].x = 1; vertices[3].y = 1;
mVB->Unlock();
return true;
}
} /* namespace layers */
} /* namespace mozilla */

Просмотреть файл

@ -175,6 +175,12 @@ private:
*/
bool VerifyReadyForRendering();
/**
* This will fill our vertex buffer with the data of our quad, it may be
* called when the vertex buffer is recreated.
*/
bool CreateVertexBuffer();
/* Array used to store all swap chains for device resets */
nsTArray<SwapChainD3D9*> mSwapChains;