Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DirectX9 Header für 64Bit (https://www.delphipraxis.net/197901-directx9-header-fuer-64bit.html)

EWeiss 17. Sep 2018 12:26


DirectX9 Header für 64Bit
 
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

TiGü 17. Sep 2018 13:51

AW: DirectX9 Header für 64Bit
 
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.

EWeiss 17. Sep 2018 13:59

AW: DirectX9 Header für 64Bit
 
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

Zacherl 17. Sep 2018 14:12

AW: DirectX9 Header für 64Bit
 
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
Delphi-Quellcode:
{$Z4}
Direktiven, etc). Der Code 0x8876086C ist
Delphi-Quellcode:
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.

TiGü 17. Sep 2018 14:17

AW: DirectX9 Header für 64Bit
 
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.

EWeiss 17. Sep 2018 14:20

AW: DirectX9 Header für 64Bit
 
Zitat:

Zitat von Zacherl (Beitrag 1413377)
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
Delphi-Quellcode:
{$Z4}
Direktiven, etc). Der Code 0x8876086C ist
Delphi-Quellcode:
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

Zacherl 17. Sep 2018 14:30

AW: DirectX9 Header für 64Bit
 
Zitat:

Zitat von EWeiss (Beitrag 1413380)
Aber mir fehlen MediaTypen die im Code von Emba nicht enthalten sind.

Ja, leider sind die offiziellen Header nicht immer die Aktuellsten :stupid: Denke die fehlenden Werte in einer seperaten Unit nachzutragen ist dennoch einfacher, als die "alten" Header zu fixen.

EWeiss 17. Sep 2018 14:40

AW: DirectX9 Header für 64Bit
 
Zitat:

Zitat von Zacherl (Beitrag 1413383)
Zitat:

Zitat von EWeiss (Beitrag 1413380)
Aber mir fehlen MediaTypen die im Code von Emba nicht enthalten sind.

Ja, leider sind die offiziellen Header nicht immer die Aktuellsten :stupid: 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

EWeiss 17. Sep 2018 22:31

AW: DirectX9 Header für 64Bit
 
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

TiGü 18. Sep 2018 08:04

AW: DirectX9 Header für 64Bit
 
Nach einen minimalen Beispielprojekt zu fragen wird wahrscheinlich abgelehnt?

EWeiss 18. Sep 2018 10:28

AW: DirectX9 Header für 64Bit
 
Zitat:

Zitat von TiGü (Beitrag 1413453)
Nach einen minimalen Beispielprojekt zu fragen wird wahrscheinlich abgelehnt?

Ich kann den Quellcode hochladen und dir den link dazu über PN mitteilen wenn das reicht.
Ein minimal Beispiel macht keinen sinn da zu viel davon abhängt das es komplett getestet wird.

gruss

TiGü 18. Sep 2018 10:37

AW: DirectX9 Header für 64Bit
 
Zitat:

Zitat von EWeiss (Beitrag 1413463)
Zitat:

Zitat von TiGü (Beitrag 1413453)
Nach einen minimalen Beispielprojekt zu fragen wird wahrscheinlich abgelehnt?

Ich kann den Quellcode hochladen und dir den link dazu über PN mitteilen wenn das reicht.
Ein minimal Beispiel macht keinen sinn da zu viel davon abhängt das es komplett getestet wird.

gruss

Nein, das bedeutet wieder unglaublich viele Abhängigkeiten.
Du musst lernen deine Probleme auf minimale Beispiele runterzubrechen.
Jeder gute Programmierer musste durch diese harte Schule gehen.

EWeiss 18. Sep 2018 10:48

AW: DirectX9 Header für 64Bit
 
Zitat:

Nein, das bedeutet wieder unglaublich viele Abhängigkeiten.
Es gibt keine Anhängigkeiten und es muss nichts installiert werden um den Quelltext auszuführen. (fremd Komponente)
Das ist der Unterschied zwischen euren und meinen Anwendungen.

Sorry! Ohne fremd Komponente geht bei euch fast gar nichts.
........
Kein Problem das Bitmap muss nicht unbedingt funktionieren mit dem VRM7 Renderer bei den anderen geht es ja. (Verwende ich so gut wie nie)
Wie sagt man? Wer nicht will der hat schon. :)

Danke.

PS:
Du kannst also eine Minimal Anwendung erstellen welche abhängig ist von deiner Komponente (50MB groß) und in dieser steckt das besagte Problem?
WOW, JA das ist eine Leistung!
Bitte sage mir wie.. Ich möchte das ernsthaft lernen.

gruss

hoika 18. Sep 2018 10:56

AW: DirectX9 Header für 64Bit
 
Hallo,
mit Minimal-Beispiel ist doch nicht die Größe des Quellcodes (in MB) gemeint.
Wenn Deine Komponente 50 MB gross ist, gut.
Aber der Code, der den Fehler bei Deiner Komponente erzeugt, könnte doch "minimal" sein.
Neues Projekt, Komponente erzeugen, die betreffende Komponenten-Methode aufrufen, fertig.

Zitat:

viel davon abhängt das es komplett getestet wird
Das wäre ja dann Deine Aufgabe;)

EWeiss 18. Sep 2018 11:04

AW: DirectX9 Header für 64Bit
 
Zitat:

Aber der Code, der den Fehler bei Deiner Komponente erzeugt, könnte doch "minimal" sein.
Neues Projekt, Komponente erzeugen, die betreffende Komponenten-Methode aufrufen, fertig.
Ja, ja Nur es ist keine Komponente sondern eine DLL.

Der Code ist nur zu erreichen wenn man den KOMPLETTEN Quelltext der DLL zur Verfügung hat.
Um an diese Position zu gelangen benötigt es mehr als diese eine Passage aus dem Quelltext um die Funktionsweise zu testen.
Kopie\Paste und ein Query auszuführen damit ist es nicht getan.

Du kannst also von DirectX , DirectDraw irgendeine Funktion testen ohne DirectX und alle Abhängigkeiten zu initialisieren Interface usw..
Wie gesagt.. das möchte ich lernen.
Manche Dinge kann man nicht einfach als Minimal Beispiel auslegen.

Um diese Funktion zu testen MUSS ein Video laufen wo anschließend das Bitmap als Overlay gezeichnet wird.
Es reicht nicht nur HRESULT auszuwerten.

Delphi-Quellcode:
hr := VMR7MixerBitmap.SetAlphaBitmap(alphaBitmap7); // Fehler nur unter 64Bit


Also entweder man will Helfen dann ist es gut und ich stelle den benötigten Quelltext zur Verfügung, wenn nicht dann erübrigt sich doch jeglicher Kommentar.
Ich erstelle doch keine neue Anwendung nur um eine Passage aus meinem Quelltext zu prüfen.
Es geht ums Eingemachte. Um daran zu gelangen müssen nun mal 50 und mehr Funktionen vorher ausgeführt werden bis man den Inhalt kosten kann.
Ja! Ich kann das Glas zerschlagen, dann viel spaß mit den Eingemachten. :)

gruss

TiGü 18. Sep 2018 13:23

AW: DirectX9 Header für 64Bit
 
Zitat:

Zitat von EWeiss (Beitrag 1413468)
Du kannst also von DirectX , DirectDraw irgendeine Funktion testen ohne DirectX und alle Abhängigkeiten zu initialisieren Interface usw..
Wie gesagt.. das möchte ich lernen.

Alles notwendige musst du natürlich in das Minmalbeispiel mit einfügen.
Vergleiche den zweiten Beitrag in diesen Thread. Da habe ich mir die Mühe gemacht, ein sofort lauffähiges Beispiel zu posten.

So ähnlich musst du es auch machen.
Alles notwendige zusammenpacken, am Besten noch ein kurzer Videoschnipsel und ein Overlay dazu und die Pfade entsprechend anpassen. Anschließend alles zippen und hochladen für die interessierte Öffentlichkeit.

Jetzt kommt der Clou: in zwei von drei Fällen funktioniert dann das Minimalbeispiel sofort und man kann mit seinem Produktiv-Quelltext vergleichen und den Fehler innerhalb kürzester Zeit finden.

EWeiss 18. Sep 2018 13:43

AW: DirectX9 Header für 64Bit
 
Zitat:

Alles notwendige musst du natürlich in das Minmalbeispiel mit einfügen.
Ist alles in meinem Quelltexten enthalten.
Ich sage es nochmal es geht hier nicht um die Erfassung eine WindowHandle sondern das ist viel komplexer es werden um diese Funktion zu prüfen zu viele andere Grundfunktionen vorausgesetzt um das prüfen zu können.
Um das in eine Minimal Anwendung zu importieren kann ich direkt meine komplette DLL verwenden denn darauf läuft es hinaus.

Danke! Aber es ist mühselig mich jetzt darüber zu unterhalten ein Minimal Beispiel zu erstellen.
  1. Es ist alles im Original enthalten.
  2. Ich möchte keine extra Anwendung schreiben nur um ein Problem in den Headern von DirectX 64Bit (genau DirectDraw) zu beheben.
  3. Wie schon gesagt wenn man helfen möchte dann kann man dies anhand des vorhandenen Quelltextes tun es ist ja nicht so das ich ihn nicht zur Verfügung stellen würde.
  4. Wenn man das nicht möchte ist es nicht notwendig sich weiter darüber zu unterhalten.
  5. Ich freue mich wenn du mir bei einigen Problemen hilfst wenn du das auf dieser Basis nicht möchtest ist es kein Problem für mich.. dann lassen wir es :)

Aber wie schon gesagt deine Hilfe ist ansonsten immer gern gesehen.. wenn es auch manchmal schwierig ist.
Deine Antwort war Nein. Lassen wir es dabei ;)

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:41 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