AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi DirectX9 Header für 64Bit
Thema durchsuchen
Ansicht
Themen-Optionen

DirectX9 Header für 64Bit

Ein Thema von EWeiss · begonnen am 17. Sep 2018 · letzter Beitrag vom 18. Sep 2018
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

DirectX9 Header für 64Bit

  Alt 17. Sep 2018, 12:26
Hat die jemand bzw. gibt es die?

Delphi-Quellcode:
  hr := m_pD3DDirect3d.CreateDevice(D3DADAPTER_DEFAULT,
    D3DDEVTYPE_HAL,
    0,
    D3DCREATE_SOFTWARE_VERTEXPROCESSING,
    @d3dpp,
    m_pD3DDevice);
Schlägt fehl unter 64Bit in 32Bit funktioniert es.

gruss

Geändert von EWeiss (17. Sep 2018 um 12:36 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: DirectX9 Header für 64Bit

  Alt 17. Sep 2018, 13:51
Nutzt du die neue Community Edition für 64-Bit?
Da bietet es sich an, die Header zu nehmen, die mit dabei sind.
Beispielpfad:
C:\Program Files (x86)\Embarcadero\Studio\19.0\source\rtl\win

Folgendes kleines Beispielprojekt kompiliert und erzeugt eine IDirect3DDevice9-Instanz unter 32- und 64-Bit:

Delphi-Quellcode:
unit Unit3;

interface

uses
  Winapi.Windows,
  Vcl.Forms,
  Winapi.Direct3D9;

type
  TForm3 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure DebugOutput(const AText: string);
begin
  OutputDebugString(PChar(AText));
end;

procedure TestDirect3D9(const AForm: TForm);
var
  m_pD3DDirect3d: IDirect3D9;
  hr: HRESULT;
  d3dpp: TD3DPresentParameters;
  m_pD3DDevice: IDirect3DDevice9;
begin
  m_pD3DDirect3d := Direct3DCreate9(D3D_SDK_VERSION);

  ZeroMemory(@d3dpp, SizeOf(d3dpp));

  d3dpp.BackBufferWidth := AForm.ClientWidth;
  d3dpp.BackBufferHeight := AForm.ClientHeight;
  d3dpp.BackBufferCount := 1;
  d3dpp.BackBufferFormat := D3DFMT_UNKNOWN;
  d3dpp.SwapEffect := D3DSWAPEFFECT_DISCARD;
  d3dpp.hDeviceWindow := AForm.Handle;
  d3dpp.Windowed := True;

  hr := m_pD3DDirect3d.CreateDevice(
    D3DADAPTER_DEFAULT,
    D3DDEVTYPE_HAL,
    0,
    D3DCREATE_SOFTWARE_VERTEXPROCESSING,
    @d3dpp,
    m_pD3DDevice);

  case hr of
    D3D_OK:
      DebugOutput('Alles chic!');
    D3DERR_DEVICELOST:
      DebugOutput('Gerät wech!');

    D3DERR_INVALIDCALL:
      DebugOutput('Falscher Aufruf');

    D3DERR_NOTAVAILABLE:
      DebugOutput('Is nich!');

    D3DERR_OUTOFVIDEOMEMORY:
      DebugOutput('Kein Platz');
  else
    DebugOutput('Alles kaputt');
  end;
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
  TestDirect3D9(Self);
end;

end.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: DirectX9 Header für 64Bit

  Alt 17. Sep 2018, 13:59
Danke erst mal für den Code.
Mein Problem ist nicht das erstellen der IDirect3DDevice9-Instanz das funktioniert mit gleichen Code unter 32Bit.
Aber nicht unter 64Bit.

Delphi-Quellcode:
function BuildDirect3d(_hMediaWindow: HWND; var m_pD3DDevice: IDirect3DDevice9; var ErrStr: string): BOOL;
var
   hr: HRESULT;
  m_pD3DDirect3d: IDirect3D9;
  d3ddm: D3DDISPLAYMODE;
  d3dpp: D3DPRESENT_PARAMETERS;
begin
  result := false;
  ErrStr := 'No Error';

   m_pD3DDirect3d := Direct3DCreate9(D3D_SDK_VERSION);
   if (m_pD3DDirect3d = nil) then
  begin
     ErrStr := ReportError('Cannot initialize Direct3D', E_FAIL);
      exit;
   end;

  hr := m_pD3DDirect3d.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, d3ddm);
   if (FAILED(hr)) then
  begin
     ErrStr := ReportError('Cannot get display adaptater infos from Direct3d', hr);
      exit;
   end;

  FillChar(d3dpp, sizeof(d3dpp), 0);
  d3dpp.Windowed := TRUE;
  d3dpp.SwapEffect := D3DSWAPEFFECT_DISCARD;
  d3dpp.BackBufferFormat := d3ddm.Format;
  d3dpp.hDeviceWindow := _hMediaWindow;

  hr := m_pD3DDirect3d.CreateDevice(D3DADAPTER_DEFAULT, // always the primary display adapter
                              D3DDEVTYPE_HAL,
                              0,
                              D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                              @d3dpp,
                              m_pD3DDevice);
   if (FAILED(hr)) then
     ErrStr := ReportError('Cannot create a Direct3d device', hr)
  else
     result := TRUE;
end;
Fehler:
'Cannot create a Direct3d device : COM Error 0x8876086C' (Nur mit 64Bit!)

PS:
Es liegt an den Headern..

gruss

Geändert von EWeiss (17. Sep 2018 um 14:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: DirectX9 Header für 64Bit

  Alt 17. Sep 2018, 14:12
Benutzt du denn die von TiGü erwähnten mitgelieferten Header? Würde ich auch wärmstens empfehlen (die alten - manuellen - C-Ports haben teilweise diverse Bugs wie fehlende {$Z4} Direktiven, etc). Der Code 0x8876086C ist D3DERR_INVALIDCALL , könnte also gut sein, dass ein Delphi Enum mit 8-Bit in ein 64-Bit Register gepackt wird, ohne die unbenutzen Bytes zu clearen, weshalb die D3D API dann einen ungültigen Wert registriert.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: DirectX9 Header für 64Bit

  Alt 17. Sep 2018, 14:17
Siehe Zacherls Beitrag!
Deine Funktion läuft hier mit der Winapi.Direct3D9-Unit problemlos in 64-Bit.
ErrStr = 'No Error' und m_pD3DDevice ist gefüllt.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: DirectX9 Header für 64Bit

  Alt 17. Sep 2018, 14:20
Benutzt du denn die von TiGü erwähnten mitgelieferten Header? Würde ich auch wärmstens empfehlen (die alten - manuellen - C-Ports haben teilweise diverse Bugs wie fehlende {$Z4} Direktiven, etc). Der Code 0x8876086C ist D3DERR_INVALIDCALL , könnte also gut sein, dass ein Delphi Enum mit 8-Bit in ein 64-Bit Register gepackt wird, ohne die unbenutzen Bytes zu clearen, weshalb die D3D API dann einen ungültigen Wert registriert.
Zitat:
Siehe Zacherls Beitrag!
Deine Funktion läuft hier mit der Winapi.Direct3D9-Unit problemlos in 64-Bit.
ErrStr = 'No Error' und m_pD3DDevice ist gefüllt.
Ja ich habe es versucht danach geht es.

Aber mir fehlen MediaTypen die im Code von Emba nicht enthalten sind.
bsp. MEDIATYPE_Subtitle, DXVA_ModeH264_E, DXVA_ModeH264_F (DirectShow9) und andere.

Delphi-Quellcode:
  {$EXTERNALSYM DXVA_ModeH264_E}
  DXVA_ModeH264_F : TGUID = (D1:$1b81be69; D2:$a0c7; D3:$11d3; D4:($b9,$84,$00,$c0,$4f,$2e,$73,$c5));

gruss

Geändert von EWeiss (17. Sep 2018 um 15:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: DirectX9 Header für 64Bit

  Alt 17. Sep 2018, 14:30
Aber mir fehlen MediaTypen die im Code von Emba nicht enthalten sind.
Ja, leider sind die offiziellen Header nicht immer die Aktuellsten Denke die fehlenden Werte in einer seperaten Unit nachzutragen ist dennoch einfacher, als die "alten" Header zu fixen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: DirectX9 Header für 64Bit

  Alt 17. Sep 2018, 14:40
Aber mir fehlen MediaTypen die im Code von Emba nicht enthalten sind.
Ja, leider sind die offiziellen Header nicht immer die Aktuellsten Denke die fehlenden Werte in einer seperaten Unit nachzutragen ist dennoch einfacher, als die "alten" Header zu fixen.
Ich habe die Header von Emba genommen DirectShow9 und Direct3D9 diese angepasst und jetzt läuft es mit 64Bit.
Muss das noch mit 32Bit testen denke aber das sollte auch funktionieren.

PS:
Nein muss die alten Header für 32Bit behalten.

Danke für die Hilfe..

gruss

Geändert von EWeiss (17. Sep 2018 um 14:48 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: DirectX9 Header für 64Bit

  Alt 17. Sep 2018, 22:31
Geht immer noch nicht wirklich.
1 Fehler in VMR7 Renderer funktioniert in 32Bit aber nicht in 64Bit

Fehler!
COM Error 0x80040227, The operation could not be performed because the filter is in the wrong state.
oder
COM Error 0x80040227, Der Vorgang konnte nicht ausgeführt werden, da der Filterstatus falsch ist.'

Delphi-Quellcode:
function TVMR7.SetBitmapFromImage(Image_: TBitmap; nAlpha: word; bitmapRect: TRECT): BOOL;
var
  hr: HRESULT;
  nRect: VMR9NormalizedRect;
  sRect, dRect: TRECT;
begin
  result := false;

  if (VMR7MixerBitmap = nil) then
  begin
       m_ErrorDescription := ReportError('Can''t set bitmap, no VMR7MixerBitmap', E_FAIL);
    exit;
  end;

  if Image_ = nil then
  begin
    alphaBitmap7.dwFlags := VMRBITMAP_DISABLE;
    hr := VMR7MixerBitmap.SetAlphaBitmap(alphaBitmap7);
    result := (SUCCEEDED(hr));
    if result then
      bIsOverlayImage := false;
    exit;
  end;

  // Accept only 32bit ARGB or 24bit RGB formatted image
  if (Image_.PixelFormat <> pf32bit) and (Image_.PixelFormat <> pf24bit) then
  begin
       m_ErrorDescription := ReportError('not a supported bitmap format', E_FAIL);
    exit;
  end;

  if not PrepareDDSurface(Image_, bitmapRect) then
    exit;

  if FAILED(m_pWindowless.GetVideoPosition(sRect, dRect)) then
    exit;

  nRect := NormalizeRect(sRect, bitmapRect);
  alphaBitmap7.dwFlags    := VMRBITMAP_ENTIREDDS;
  alphaBitmap7.hdc            := 0;
  alphaBitmap7.pDDS         := m_pDDSurface;
  alphaBitmap7.rDest.top   := nRect.top;
  alphaBitmap7.rDest.left := nRect.left;
  alphaBitmap7.rDest.bottom := nRect.bottom;
  alphaBitmap7.rDest.right    := nRect.right;
  alphaBitmap7.fAlpha       := nAlpha / 255.0;
  alphaBitmap7.clrSrcKey   := 0;

  // SHOW the bitmap
  hr := VMR7MixerBitmap.SetAlphaBitmap(alphaBitmap7); // Fehler nur unter 64Bit

  m_pWindowless.RepaintVideo(m_hMediaWindow, m_hMediaDC);
  result := (SUCCEEDED(hr));
  if result then
    bIsOverlayImage := true;
end;
getestet mit meinen und den direkten Headern von Emba /rtl/win
Der Video Renderer meldet keine Fehler (Filme spielen gut ab) nur das mit dem Overlay Bitmap will nicht.

gruss

Geändert von EWeiss (17. Sep 2018 um 23:25 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: DirectX9 Header für 64Bit

  Alt 18. Sep 2018, 08:04
Nach einen minimalen Beispielprojekt zu fragen wird wahrscheinlich abgelehnt?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz