2013-01-03 24 views
2

我有一種具體的問題。SlimDX9 - 具有RenderToSurface的Device.Reset

我一直在嘗試重置窗口調整大小後更改分辨率的SlimDX9設備。一切都在Pool.Managed,沒有字體,沒有Stateblocks,一切正常,但一個紋理+表面+ RenderToSurface組合。我需要將紋理作爲着色器的renderTarget,稍後進行後處理,所以我需要將紋理調整爲客戶端大小以及後置緩衝區的大小。

我創建這樣的組合:

rtTexture = new Texture(this.Device, this.owner.ClientSize.Width, this.owner.ClientSize.Height, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default); 
rtSurface = rtTexture.GetSurfaceLevel(0); 
rtHelper = new RenderToSurface(this.Device, this.owner.ClientSize.Width, this.owner.ClientSize.Height, Format.A8R8G8B8, Format.D24S8); 

當窗口大小,我做

rtTexture.Dispose(); 
rtSurface.Dispose(); 

,我都試過

rtHelper.OnLostDevice(); 

rtHelper.Dispose(); 

當然,在Device.Reset(getParameters())之後重新創建資源/調用rtHelper.OnResetDevice(),兩者都不起作用。我嘗試了使用Dispose()和OnDeviceLost()的每種組合。

unsuccessfull復位,並且通常InvalidCall後,我得到這個消息

All user created D3DPOOL_DEFAULT surfaces must be freed before ResetEx can succeed. ResetEx Fails. 

所以我PIXed的應用,並發現,無論是質地也不表面被佈置(存在「never」中的銷燬列)DESPITE的事實是,對這兩個對象顯式調用.Dispose(),並且在Device.Reset()之前IsDisposed爲true。

刪除組合使復位很好。問題出在RenderToSurface重置和/或紋理+表面的某處。

我這樣使用RenderToSurface:

rtHelper.BeginScene(rtSurface, new Viewport(0, 0, this.owner.ClientSize.Width, this.owner.ClientSize.Height)); 
{ 
    Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, FogColor, 1, 0); 
    terrainEffect.BeginPass(0); 
    RenderTiles(); 
    terrainEffect.EndPass(); 
} 
rtHelper.EndScene(Filter.None); 

它甚至有可能?這是SlimDX中的錯誤嗎?我能做什麼? 我可以以某種方式訪問​​非託管資源,並手動銷燬它們嗎?

請幫忙,我不知道下一步該怎麼做。我非常感謝對此的任何迴應。謝謝。

編輯:我試着去各地RenderToSurface和使用Device.get/SetRenderTarget方法()和問題仍然存在,表面和紋理不被Device.Reset之前的Dispose()(已毀)。

回答

1

我已經想通了! 對於任何人遇到了同樣的問題:

如果您使用的是一個着色器通道創建紋理,將其分配給着色器,並在第二次使用它,你使用它(​​之前)之後一定要設置紋理null。像這樣:

terrainEffect.SetTexture(hRTTexture, null); 

其中hRTTexture是紋理的處理程序。似乎着色器會鎖定紋理,並且如果着色器具有此鎖定,SlimDX不能處理此紋理(和相關表面)。

希望這可以幫助別人。