मेरे पास कुछ संगणक शेड हैं जिन्हें एक निश्चित क्रम में निष्पादित करने की आवश्यकता है और जिनके आउटपुट पिछले इनपुट पर निर्भर करते हैं। आदर्श रूप से, मुझे कभी भी बफर क्लाइंट-साइड कॉपी करने और अपने सभी काम GPU पर करने की आवश्यकता नहीं होगी।
विचार करें कि मेरे पास दो कम्प्यूट शेयर्स हैं जो संकलित हैं और जैसे program_one
और लिंक किए गए हैं program_two
। मान लीजिए कि मेरे पास एक GL_SHADER_STORAGE_BUFFER
डेटा है जिसमें लिखा program_one
और लिखा हुआ है program_two
। क्या मैं बस निम्नलिखित कर सकता हूं:
glUseProgram(program_one);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer);
glDispatchCompute(16, 16, 1);
glUseProgram(program_two);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer);
glDispatchCompute(16, 16, 1);
क्या यह गारंटी है कि पहली गणना shader के सभी इनवोकेशन दूसरे के किसी भी इनवोकेशन (पढ़ने और लिखने के बीच डेटा दौड़ से बचने के लिए) से पहले खत्म हो जाएगी buffer
? यदि नहीं, तो मैं उन्हें कैसे सिंक्रनाइज़ करूं?