2015-03-03 4 views
13

article on Imagination's website में, मैं निम्नलिखित पैराग्राफ पढ़ा है:यूबीओ/एसएसबीओ वल्कन के शेडर मेमोरी बाइंडिंग से अलग कैसे हैं?

उदाहरण के लिए, कोई glUniform*() Vulkan में बराबर प्रवेश द्वारों हैं; इसके बजाय, जीपीयू मेमोरी को लिखना शेडर्स को डेटा पास करने का एकमात्र तरीका है।

जब आप glUniform*() पर कॉल करते हैं, तो ओपनजीएल ईएस ड्राइवर को आम तौर पर ड्राइवर प्रबंधित बफर आवंटित करने और उसमें डेटा कॉपी करने की आवश्यकता होती है, जिसका प्रबंधन सीपीयू ओवरहेड में आता है। वल्कन में, आप बस मेमोरी एड्रेस को मैप करते हैं और उस मेमोरी लोकेशन को सीधे लिखते हैं।

क्या इसके बीच कोई अंतर है और वर्दी बफर का उपयोग कर रहा है? उन्हें स्पष्ट रूप से आवंटित किया जाता है और मनमाना डेटा ले जा सकते हैं। चूंकि वर्दी बफर आकार में काफी सीमित हैं, शायद Shader Storage Buffers एक बेहतर समानता है।

+2

OpenGL ड्राइवर एक बफर और संदर्भ में सभी वर्दी युक्त पहले से ही नहीं एक समान बफर बनाने के लिए स्वतंत्र हैं:

चश्मा अभी तक जारी नहीं किया गया है, यहाँ क्या यह की तरह लग सकता है की एक काल्पनिक उदाहरण है कि glUniform कॉल में; वल्कन को यह स्पष्ट लगता है कि –

+0

समान बफर के समान लगता है। मुझे लगता है कि हम 5 वें स्थान पर पाएंगे जब वाल्व अपनी जीडीसी बात करेंगे। – Robinson

उत्तर

11

जो मैं समझता हूं, यह glUniform*() विशिष्ट नहीं है: glUniform*() केवल लेख का लेखक द्वारा उपयोग किया गया उदाहरण है कि वल्कन मेजबान और जीपीयू के बीच संचार के संबंध में काम करता है।

जब आप glUniform*() फोन, OpenGL ES ड्राइवर आम तौर पर एक ड्राइवर कामयाब बफर आवंटित और इसे करने के लिए डेटा की प्रतिलिपि, जिनका प्रबंधन सीपीयू भूमि के ऊपर पड़ता है की जरूरत है।

इस परिदृश्य में, जब कोई उपयोगकर्ता डेटा के साथ glUniform*() कहता है, कि डेटा पहली ओपन कार्यान्वयन के स्वामित्व वाले एक बफर में कॉपी किया है। यह बफर शायद पिन किया गया है, और तब ड्राइवर द्वारा डेटा को डीएमए के माध्यम से डेटा स्थानांतरित करने के लिए उपयोग किया जा सकता है। यह दो चरण हैं:

  1. उपयोगकर्ता डेटा को ड्राइवर बफर में कॉपी करें;
  2. डीएमए के माध्यम से जीपीयू को बफर सामग्री ट्रांसफर करें।

Vulkan, आप बस स्मृति पता नक्शा और सीधे कि स्मृति स्थान लिखें।

इस परिदृश्य में, वहाँ उपयोगकर्ता डेटा की कोई मध्यवर्ती प्रतिलिपि है। आप वल्कन से मेजबान के वर्चुअल एड्रेस स्पेस में एक क्षेत्र को मैप करने के लिए कहते हैं, जिसे आप सीधे लिखते हैं। उपयोगकर्ता के लिए डेटा पूरी तरह पारदर्शी तरीके से डीएमए के माध्यम से डिवाइस पर जाता है।

प्रदर्शन दृष्टिकोण से, लाभ स्पष्ट हैं: शून्य प्रति। इसका मतलब यह भी है कि वल्कन कार्यान्वयन सरल हो सकता है, क्योंकि इसे मध्यवर्ती बफर को प्रबंधित करने की आवश्यकता नहीं है।

// Assume Lights is some kind of handle to your buffer/data 
float4* lights = vkMap(Lights); 

for (int i = 0; i < light_count; ++i) { 
    // Goes directly to the device 
    lights[i] = make_light(/* stuff */); 
} 

vkUnmap(lights); 
+0

... और संभवतः आप लेआउट स्लॉट असाइन करने और उन लोगों के लिए बाध्य करने के बजाय अपने शेडर को "पॉइंटर" पास करते हैं? – Robinson

+1

@ रॉबिन्सन: ऐसा लगता है कि एपीआई का नेतृत्व अब कुछ समय से हुआ है। जब आप वस्तुओं को बाध्य करते हैं तो सत्यापन की तरह चीजें अवांछनीय प्रदर्शन के अनुसार होती हैं और मैटल, वल्कन, मेटल, डीएक्स 12 इत्यादि। आप सभी चीजों को दूर करने की कोशिश करते हैं ताकि आप अपने आप को पैर में शूट कर सकें;) ऑब्जेक्ट बाइंडिंग टाइपकास्ट संसाधनों के प्रकार भी एक चीज़ या दूसरे होने के नाते, जैसा कि हमने बनावट के विचारों के परिचय के साथ देखा, हमेशा आवश्यक नहीं है। नया प्रतिमान सिर्फ संसाधनों को मनमाने ढंग से स्मृति के रूप में पेश करने के लिए है और एप्लिकेशन डेवलपर को यह समझने के लिए कि यह कैसे समझें। –

+1

@ एंडोनएम। कोलमैन यह इंगित किया जाना चाहिए कि इसका मतलब टाइप सुरक्षा में हानि का मतलब नहीं है; कम से कम उच्च स्तर पर। बेशक यदि आप सी या सी ++ से वल्कन का उपयोग कर रहे हैं तो आप सीधे अपने पैर में अपने आप को शूट करने में सक्षम हैं। लेकिन अधिकांश ग्राफिक्स अनुप्रयोगों में वैसे भी अपनी खुद की अमूर्त परत होती है (और ओपनजीएल ड्राइवरों की परतें केवल ब्लोट जोड़ती हैं) और इन डोमेन विशिष्ट अमूर्त परतों को फिर से काम करने के लिए अच्छा लगता है। – datenwolf

संबंधित मुद्दे