2012-06-21 32 views
6

मैं अपने डायरेक्ट 3 डी एप्लिकेशन में एकाधिक थ्रेड और ऑब्जेक्ट्स के बीच एक डायरेक्ट 3 डी डिवाइस साझा करना चाहता हूं। मैं, Direct3D डिवाइस प्रबंधक, जो मैं क्या चाहते हैं की तरह लग रहा भर में आया था, हालांकि मैं किसी भी वीडियो प्रसंस्करण या वीडियो त्वरण नहीं कर रहा हूँ:मैं डायरेक्ट 3 डी डिवाइस मैनेजर का उपयोग कैसे करूं?

// Create the device manager 
    UINT resetToken = 0; 
    IDirect3DDeviceManager9* deviceManager = NULL; 
    if (FAILED(DXVA2CreateDirect3DDeviceManager9(&resetToken, &deviceManager))) 
    return false; 

    // Add the device to the device manager 
    if (FAILED(deviceManager->ResetDevice(device, resetToken))) 
    return false; 

    deviceManager->AddRef(); 
: http://msdn.microsoft.com/en-us/library/windows/desktop/aa965267(v=vs.85).aspx

मेरे कोड में, मैं निम्नलिखित कर रहा हूँ

मेरा प्रश्न है कि मैंने डायरेक्ट 3 डी डिवाइस मैनेजर बनाया है, मैं डिवाइस मैनेजर को पॉइंटर के पास गुजरने के बिना डायरेक्ट 3 डी डिवाइस मैनेजर को अन्य ऑब्जेक्ट्स के साथ कैसे साझा करूं? माइक्रोसॉफ्ट विशेष रूप से निम्नलिखित करने के लिए कहा है, लेकिन मैं कोई सुराग नहीं क्या वास्तव में निम्नलिखित मतलब है है:

डिवाइस स्वामी अन्य वस्तुओं IDirect3DDeviceManager9 इंटरफ़ेस करने के लिए एक सूचक पाने के लिए एक तरीका प्रदान करना चाहिए। मानक तंत्र IMFGetService इंटरफ़ेस को लागू करना है। सेवा GUID MR_VIDEO_ACCELERATION_SERVICE है।

क्या कोई वहां मुझे दिखा सकता है कि IMFGetService इंटरफ़ेस का उपयोग कर डिवाइस मैनेजर को कैसे साझा किया जाए?

उत्तर

4

यदि आप कोई वीडियो प्रोसेसिंग नहीं कर रहे हैं, तो मुझे IDirect3DDeviceManager9 इंटरफ़ेस को कार्यान्वित करने और/या उपयोग करने में कोई बिंदु नहीं दिखाई देता है।

डायरेक्ट 3 डी डिवाइस के जीवनकाल के प्रबंधन के अपने तरीके को लागू करें, जिससे इंटरफ़ेस पॉइंटर आपके ऑब्जेक्ट/थ्रेड पर उपलब्ध हो और सिंक्रनाइज़ेशन करें। एक डायरेक्ट 3 डी डिवाइस किसी भी तरह की जादुई चीज़ नहीं है जिसे केवल IDirect3DDeviceManager9 के माध्यम से वस्तुओं/धागे के बीच साझा किया जा सकता है। यह किसी भी अन्य संसाधन की तरह है। और यदि आप इसे सही तरीके से प्रारंभ करते हैं, तो आप अलग-अलग थ्रेडों से समसामयिक तरीकों को भी कॉल कर सकते हैं (यानी बहुत कुछ जो डिवाइस डिवाइस पर भरोसा नहीं करता है जिसे किसी अन्य थ्रेड द्वारा बदला जा सकता है)।

इंटरफ़ेस पॉइंटर उपलब्ध करना पॉइंटर धारण करने वाले सिंगलटन के रूप में सरल हो सकता है। या, यदि आपकी ऑब्जेक्ट्स/धागे पहले से ही किसी भी तरह से सहयोग करते हैं, तो उनके पास पहले से ही जानकारी का आदान-प्रदान करने का कुछ साधन होना चाहिए। तो मुझे लगता है कि आप केवल वही विस्तार करने में सक्षम होना चाहिए जो आपको पहले से ही ऑब्जेक्ट/थ्रेड को Direct3D डिवाइस तक पहुंचाने के लिए है। और CRITICAL_SECTION का उपयोग कर सिंक्रनाइज़ेशन आसानी से किया जा सकता है।

तुम सच में तो IDirect3DDeviceManager9 उपयोग करने के लिए, चाहते हैं, तो - जहाँ तक मैं यह समझ के रूप में - आप सभी वस्तुओं जिसमें से आप IDirect3DDeviceManager9 के लिए उपयोग करना चाहते हैं पर IMFGetService इंटरफ़ेस को लागू करने की है। GetService फ़ंक्शन को कार्यान्वित करें ताकि जब MR_VIDEO_ACCELERATION_SERVICE/IDirect3DDeviceManager9 के लिए पूछा जाए तो यह आपके डायरेक्ट 3 डी डिवाइस को प्रबंधित करने वाली ऑब्जेक्ट में एक इंटरफ़ेस पॉइंटर देता है।


संपादित करें: कोड नमूना के बारे में: मुझे आशा है कि स्पष्टीकरण यहाँ दी पर्याप्त है। एकाधिक धागे के बीच सामान साझा करना कुछ ऐसा है जो मुझे एक संक्षिप्त कोड-नमूना के साथ व्याख्या करने की कोशिश नहीं करता है। यदि आप बहु-थ्रेडेड अनुप्रयोगों को लिखना चाहते हैं, तो डायरेक्ट 3 डी डिवाइस का उपयोग करना अन्य संसाधनों के साथ कैसे किया जाता है उससे अलग नहीं है। और यदि आप नहीं जानते कि बहु-थ्रेडेड अनुप्रयोगों को कैसे लिखना है तो वह विषय एक ही स्टैक ओवरफ्लो उत्तर के लिए बहुत जटिल है।

प्रश्न के संबंध में एमएस IDirect3DDeviceManager9 का उपयोग करने की सिफारिश क्यों करता है ... अच्छा, मुझे ऐसी सामान्य सिफारिश के बारे में पता नहीं है।वीडियो प्रोसेसिंग (डीएक्सवीए, ईवीआर इत्यादि का उपयोग करते समय) की सिफारिश की जाती है। या अधिक अनिवार्य की तरह; मुझे यकीन नहीं है कि आप डी 3 डी डिवाइस को उदा। डी 3 डी डिवाइस मैनेजर का उपयोग किए बिना उन्नत वीडियो रेंडरर। यही कारण है कि डी 3 डी डिवाइस मैनेजर सभी के लिए बनाया गया था।

प्रलेखित रास्ता: ही कभी VMR9 की "वर्तमान" कॉलबैक से उपकरण में पहुंच VMR9 दाता के साथ एक उपकरण को साझा के साथ दो तरह से ही संभव था। जो सीमित है - उदा। आप वीडियो की फ्रेम दर तक ही सीमित हैं।

अनियंत्रित तरीका:IVMRFilterConfig9::SetNumberOfStreams पर कॉल न करें और केवल एक इनपुट स्ट्रीम कनेक्ट करें। इस तरह वीएमआर 9 "मिक्सर मोड" पर स्विच नहीं करेगा, और जब "मिक्सर मोड" में नहीं होगा तो वीएमआर 9 किसी भी डिवाइस स्टेटस को नहीं बदलेगा। इसलिए यदि डी 3 डी डिवाइस को बहुप्रचारित प्रारंभ किया गया था, तो आप उसी डिवाइस का उपयोग कर VMR9 का उपयोग कर मुक्त रूप से D3D डिवाइस का उपयोग कर सकते हैं।

इसके अलावा वीएमआर 9 के साथ अन्य डायरेक्टशो फ़िल्टर में डी 3 डी डिवाइस का उपयोग करना संभव नहीं था। डी 3 डी डिवाइस मैनेजर उस पर सुधार करता है, फ़िल्टर और अपने स्वयं के एप्लिकेशन कोड को डी 3 डी डिवाइस का उपयोग करने की क्षमता देता है - जिसमें बदलते राज्य शामिल हैं। यदि आप प्रत्येक घटक को लागू करते हैं जो स्वयं डी 3 डी डिवाइस का उपयोग करेगा, तो डी 3 डी डिवाइस मैनेजर में वास्तव में कोई बिंदु नहीं है। और यहां तक ​​कि यदि आप तीसरे पक्ष के घटकों का उपयोग कर रहे हैं जिसके लिए एक डी 3 डी डिवाइस की आवश्यकता है तो आप केवल डी 3 डी डिवाइस मैनेजर का उपयोग करने में सक्षम होंगे यदि वे घटक इसका समर्थन करते हैं। जो तब तक मामला नहीं होगा जब तक कि उन घटकों को DirectShow या MediaFoundation फ़िल्टर/घटक न हों।