2

DX10.1サポートの代わりにDX10にドロップダウンすることは可能ですか?コンピューターがDX10のみをサポートしているクライアントがありますが、FMは10.1のみをサポートしているように見えるため、Direct2Dを利用できません。

DX10(FMX.Canvas.D2DおよびFMX.Context.DX10)を使用するようにソースを変更し、DX10にドロップダウンする別のスイッチを作成しようとしましたが、1つの呼び出しが失敗したようです。

共有デバイスの作成方法を変更しました

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;

デバイスを使用しているときは、次のようなコードを使用します。

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で失敗します。

そのため、アプリは読み込まれますが、ターゲットを作成できないため、フォームはすべて空白になります。

これを助けることができる教祖はいますか?

4

1 に答える 1

2

Direct2D 1.0 は Direct3D 10.1 との相互運用をサポートしますが、機能レベルの選択によって Direct3D 10.0 ハードウェアをサポートすることもできます。Delphi については何も知りませんが、D3D10CreateDevice を呼び出して Direct3D デバイスを作成する代わりに、D3D10CreateDevice1 関数を呼び出す必要があります。次に、D3D10_FEATURE_LEVEL_10_0 など、必要な機能レベルを要求するだけです。

于 2013-01-17T15:52:14.980 に答える