DirectX erőforrás megosztása a Device-ok között.

DirectX erőforrás megosztása a Device-ok között.
2010-07-19T12:23:18+02:00
2010-07-23T11:47:06+02:00
2022-11-18T14:35:36+01:00
!mélynyomó
Sziasztok!

Elég régóta szenvedek ezzel a témakörrel. Több lehetséges megoldást is kipróbáltam, de valahogy mindig falba ütköztem. Először DX9-es device-ok közt próbáltam textúrát megosztani, majd egy DX9-es és DX10-es között. Jelenleg DX10-esekkel dolgozok.
Windows 7 x64-es rendszeren dolgozok VS2008-ban.
Végeredményben azt szeretném hogy az egyik device-on lévő textúrát shader-ezve a másik device-on tudjam a renderelésnél használni, és a másodlagos monitoron megjeleníteni.
Azért kell a 2 device, mert a 3ds max-hoz írok plugint, és a backbuffer 1*1px. Annyit szenvedtem ezzel a résszel, hogy hagyom a fenébe.

Most konkrétan az a gond, hogy a megosztandó erőforrástól lekérdezem GetSharedHandle-el a handle-t, és ez S_OK-ot ad visza és NULL-ra állítja a megadott handle-t, amivel egyszerűen nem tudok mit kezdeni.

ID3D10ShaderResourceView *pSRView = NULL; hr = D3DX10CreateShaderResourceViewFromFile( lpDevice, "seafloor.dds", NULL, NULL, &pSRView, NULL ); ID3D10Resource *shaderRes = NULL; pSRView->GetResource(&shaderRes); D3D10_RESOURCE_DIMENSION shaderDim; shaderRes->GetType(&shaderDim); ID3D10Texture2D *shaderTex = NULL; hr = shaderRes->QueryInterface(IID_ID3D10Texture2D, (void**)&shaderTex); D3D10_TEXTURE2D_DESC desc3; shaderTex->GetDesc(&desc3); hr = shaderTex->QueryInterface(IID_IDXGIResource, (void**)&pGIResource); DXGI_USAGE usage; hr = pGIResource->GetUsage(&usage); //DXGI_USAGE_SHADER_INPUT HANDLE sharedHandle = NULL; hr = pGIResource->GetSharedHandle(&sharedHandle);

Ezt a kódot debug-olva, azt kaptam, hogy az összes függvény hr-je S_OK, minden érték teljesen normális, kivéve a sharedHandle-t ami ugyanúgy 0x000000 a GetSharedHandle után is, holott a hr az S_OK.
Fogalmam sincs mi a gond.
Mutasd a teljes hozzászólást!
Megvan a megoldás.
Létre kellett hozni egy textúrát ezekkel a flag-ekkel:
D3D10_CPU_ACCESS_WRITE, DXGI_FORMAT_R8G8B8A8_UNORM, D3D10_BIND_SHADER_RESOURCE, és még néhány beállításra oda kellett figyelni, majd a CopyResource-al átmásolni a textúrát.
Így már meg tudtam osztani, és fel tudtam használni a másik device-on. Remélem hogy ha valaki más is ezzel szenved, segítségére lesz ez az infó, mert én kegyetlen sokat szenvedtem ezzel.
Mutasd a teljes hozzászólást!

  • Sehogy, más a két api architektúrája, nem fogsz tudni textúrákat osztogatni közöttük, hacsak nem nyúlsz bele driver szinten.
    Mutasd a teljes hozzászólást!
  • Esetleg lock-olni a textúrákat és átmásolni 'kézzel' (memcpy() rulez), mondjuk lassabb lesz.
    Mutasd a teljes hozzászólást!
  • Megvan a megoldás.
    Létre kellett hozni egy textúrát ezekkel a flag-ekkel:
    D3D10_CPU_ACCESS_WRITE, DXGI_FORMAT_R8G8B8A8_UNORM, D3D10_BIND_SHADER_RESOURCE, és még néhány beállításra oda kellett figyelni, majd a CopyResource-al átmásolni a textúrát.
    Így már meg tudtam osztani, és fel tudtam használni a másik device-on. Remélem hogy ha valaki más is ezzel szenved, segítségére lesz ez az infó, mert én kegyetlen sokat szenvedtem ezzel.
    Mutasd a teljes hozzászólást!
  • NAGYON


    Hé, moderátor bácsi!

    Ez mé' 0 pont??? Tudtommal mindenki elfogadhatja saját megoldását is a problémájára, ha addig más nem oldotta meg. Legalábbis a szabályzatban ez van.

    Mert sirpalee butaságot írt (nem igaz, hogy nem lehet), Tromtrom pedig nem hardveres megoldásra adott irányelvet, pedig a kérdezőnek egyértelműen ez kellett. És ezt követően a kérdező (!mélynyomó) megadta a megoldást, ami saját bevallása szerint rendesen működik.

    Illetve a megoldás bizonyára másnak is hasznos információ lesz majd (nekem nem, mert nem foglalkozok DirectX-szel).

    Szóval ez simán megérné az 50 pontot, nem éppen triviális kérdést válaszolt meg, és rajta kívül senki más nem tudta megoldani.

    Tehát miért 0-pont ez???
    Mutasd a teljes hozzászólást!

  • Osztom Banderasz véleményét.
    Ez egy hasznos megoldás.
    Mutasd a teljes hozzászólást!
  • Nem írtam butaságot közvetlen hardveres elérésre dx 9 és dx10 api között NINCSEN lehetőség. Ergo, hogy a két device UGYANAZT a textúrát használja. Akárhogy erőlködtök ez API szinten nem megoldható.

    A leggyorsabb megoldás, ha olyan 3rd parti apival MÁSOLOD (ergo nem közvetlen eléred) ami képes mind dx9el mind dx10el kommunikálni. Pl cuda és opencl. De ha annyira értesz hozzá, hogy lehetséges, írd le hogy lehet KÖZVETLENÜL ugyanazt a textúrát elérni csak a dx9 és dx10 api használatával. Nem fog menni.
    Mutasd a teljes hozzászólást!
  • Szerintem vagy te, vagy én (de kettőnk közül valaki biztosan) félreértette a dolgot. Én így értelmeztem:

    - Két DirectX9-es device között egy textúra közös elérés vagy másolása.
    - Két DirectX10-es device között egy textúra közös elérés vagy másolása.
    - De semmiképpen sem DirectX9-es device és DirectX10 device között.

    Én nem gondoltam arra, hogy a két API között akar átjárhatóságot, mert én is úgy vélem, hogy
    "közvetlen hardveres elérésre dx 9 és dx10 api között NINCSEN lehetőség"
    (bár ez csak tipp a részemről, mert nem használok DirectX-et).

    Te pedig (ha jól gondolom) kizárólagosan a 2 külön API közötti device-ok együttes használatára gondoltál, de szerintem a topiknyitó nem így értette, csak max. kétségbeesésében már ezzel is megpróbálta:

    "Először DX9-es device-ok közt próbáltam textúrát megosztani, majd egy DX9-es és DX10-es között. Jelenleg DX10-esekkel dolgozok."


    Vagyis szerintem rendesen elbeszélünk egymás mellett...
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd