المزامنة بين الأوامر في Vulkan باستخدام الحاجز Barrier

من ويكي
اذهب إلى: تصفح، ابحث

تستخدم الحواجز barriers للمزامنة بين الأوامر المرسلة عبر نفس طابور المعالجة، تختلف الحواجز عن السيمافور من ناحية أنها أخف وتسمح لك بتحديد المواضع في أنابيب المعالجة والموارد التي تتطلب مزامنة، لنفترض مثلاً أنك تريد نسخ بيانات من ذاكرة إلى ذاكرة وسيطة أخرى وتريد قراءة هذه الذاكرة لاحقاً من مظللات النقاط في أحد النماذج التي تريد تصييرها، ستجد هنا أن هناك مراحل قبل مرحلة مظلل النقاط لاتقرأ من تلك الذاكرة، وأن معظم الأوامر الباقية لاتقرأ من تلك الذاكرة، لو استخدمت الحواجز فهذا سيعطي المراحل السابقة والأوامر الأخرى الخاصة بتصيير النماذج التي لاتستخدم تلك الذاكرة فرصة لتنفذ مما يقلل كثيراً من الفقاعات والفراغات في المعالجة التي يكون فيها الجهاز خامل.

لإضافة حاجز بين مجموعتين من الأوامر نستدعي الأمر vkCmdPipelineBarrier() بين تلك المجموعتين والذي يأخذ معلومات الموارد المراد مزامنة الوصول إليها، يضع هذا الأمر حاجز بين المجموعة الأولى التي تسبق الأمر وبين المجموعة الثانية التي تليه، سواءً تلك التي أرسلتها عبر الطابور أو لم ترسلها بعد وكذلك تلك التي تخطط لإرسالها، في حال استدعيت vkCmdPipelineBarrier() داخل مرحلة تصيير render-pass، فإن الحاجز سيُوضع بين الأوامر التي تسبقه والتي تليه فقط داخل وفي حدود مرحلة التصيير، الأوامر التي استدعيتها خارج مرحلة التصيير لن تتأثر بالحاجز، ستتضح هذه النقطة عند حديثنا عن مراحل التصيير والكائن VkRenderPass.