From 1c4fe46fe9343f9cd702bf73768ee218c3b55134 Mon Sep 17 00:00:00 2001 From: Bas Schouten Date: Tue, 23 Nov 2010 17:24:39 +0100 Subject: [PATCH] Bug 614111: Clear and recreate VertexBuffer on device reset. r=jrmuizel a=blocking-beta8 --- gfx/layers/d3d9/DeviceManagerD3D9.cpp | 58 +++++++++++++++++---------- gfx/layers/d3d9/DeviceManagerD3D9.h | 6 +++ 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/gfx/layers/d3d9/DeviceManagerD3D9.cpp b/gfx/layers/d3d9/DeviceManagerD3D9.cpp index 8c49513147d2..58c773919158 100644 --- a/gfx/layers/d3d9/DeviceManagerD3D9.cpp +++ b/gfx/layers/d3d9/DeviceManagerD3D9.cpp @@ -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 */ diff --git a/gfx/layers/d3d9/DeviceManagerD3D9.h b/gfx/layers/d3d9/DeviceManagerD3D9.h index 7351e7e95861..2f25dd83970b 100644 --- a/gfx/layers/d3d9/DeviceManagerD3D9.h +++ b/gfx/layers/d3d9/DeviceManagerD3D9.h @@ -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 mSwapChains;