2013-01-15 74 views
2

是否可以下降到DX10而不是DX10.1支持。我有一臺客戶端,它的電腦只支持DX10,所以他們不能利用Direct2D,因爲FM似乎只支持10.1Firemonkey中的DirectX10支持(不是10.1)

我試着修改源代碼來使用DX10(FMX.Canvas.D2D和FMX.Context .DX10),並將另一臺交換機降至DX10,但一次呼叫似乎失敗。

我已修改shareddevice創建

if not Assigned(FSharedDevice) then 
begin 
SaveClearFPUState; 
try 
Flags := {$ifdef DXDEBUG}D3D10_CREATE_DEVICE_DEBUG{$else}0{$endif}; 
Flags := Flags or D3D10_CREATE_DEVICE_BGRA_SUPPORT; 
HR := D3D10CreateDevice(nil, FDriverType, 0, Flags, D3D10_SDK_VERSION, FSharedDevice); 
if Succeeded(HR) then 
begin 
HR := FSharedDevice.CreateBuffer(TD3D10_BufferDesc.Create(VBSize, D3D10_BIND_VERTEX_BUFFER, D3D10_USAGE_DYNAMIC, D3D10_CPU_ACCESS_WRITE), nil, @FVB); 
HR := FSharedDevice.CreateBuffer(TD3D10_BufferDesc.Create(IBSize, D3D10_BIND_INDEX_BUFFER, D3D10_USAGE_DYNAMIC, D3D10_CPU_ACCESS_WRITE), nil, @FIB); 
// Acquire device DXGI factory 
HR := FSharedDevice.QueryInterface(IDXGIDevice, DXGIDevice); 
if Succeeded(HR) and (DXGIDevice <> nil) then 
begin 
HR := DXGIDevice.GetParent(IDXGIAdapter, DXGIAdapter); 
if Succeeded(HR) and (DXGIAdapter <> nil) then 
HR := DXGIAdapter.GetParent(IDXGIFactory, FDXGIFactory); 
end; 
if not Assigned(FDXGIFactory) then 
HR := CreateDXGIFactory(IDXGIFactory, FDXGIFactory); 
end; 
finally 
RestoreFPUState; 
end; 
end; 

並且當我使用的裝置I使用這樣的代碼通過以下方式..

SharedDevice: ID3D10Device 

if Assigned(TCustomDX10Context.SharedDevice) then 
begin 
FillChar(Desc, SizeOf(D3D10_TEXTURE2D_DESC), 0); 
Desc.Format := DXGI_FORMAT_B8G8R8A8_UNORM; 
Desc.Width := 1; 
Desc.Height := 1; 
Desc.MipLevels := 1; 
Desc.ArraySize := 1; 
Desc.SampleDesc.Count := 1; 
Desc.SampleDesc.Quality := 0; 
Desc.Usage := D3D10_USAGE_DEFAULT; 
Desc.BindFlags := D3D10_BIND_RENDER_TARGET or D3D10_BIND_SHADER_RESOURCE; 
Res := TCustomDX10Context.SharedDevice.CreateTexture2D(Desc, nil, FSharedTexture); 
Prop := D2D1RenderTargetProperties(TargetMode, D2D1PixelFormat(DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED)); 
Res := FFactory.CreateDxgiSurfaceRenderTarget(FSharedTexture as IDXGISurface, Prop, FSharedRenderTarget); 
end; 

我已經在源創建的開關這允許我在10.1和10設備之間切換,並修改了FMX.Canvas.D2D和FMX.Context.DX10中的所有代碼以使用替代設備。

但是...

CreateDxgiSurfaceRenderTarget失敗,錯誤代碼-2147024809。

因此,應用程序加載,但表單都是空白的,因爲無法創建目標。

任何大師的外面,可以幫助這個?

+0

我實際上打開了D2D調試,我得到這個警告...... Direct3D設備沒有用D3D11_CREATE_DEVICE_BGRA_SUPPORT創建,因此與Direct2D不兼容。 那麼這是否意味着Direct2D只能在DX10.1上運行,而不能在DX10上運行? –

+0

這是在Embarcadero論壇上討論的,有人認爲由於某種技術原因這是不可能的。 – mj2008

回答

2

Direct2D 1.0支持與Direct3D 10.1互操作,但它仍然可以通過功能級別選擇支持Direct3D 10.0硬件。我對Delphi沒有任何瞭解,但不需要調用D3D10CreateDevice來創建Direct3D設備,而需要調用D3D10CreateDevice1函數。然後您可以簡單地請求您所需的功能級別,例如D3D10_FEATURE_LEVEL_10_0。

相關問題