সিঙ্ক্রোনাইজেশন ফ্রেমওয়ার্ক

সিঙ্ক্রোনাইজেশন ফ্রেমওয়ার্ক স্পষ্টভাবে অ্যান্ড্রয়েড গ্রাফিক্স সিস্টেমে বিভিন্ন অ্যাসিঙ্ক্রোনাস অপারেশনগুলির মধ্যে নির্ভরতা বর্ণনা করে। ফ্রেমওয়ার্ক একটি API প্রদান করে যা উপাদানগুলিকে নির্দেশ করতে সক্ষম করে যখন বাফার প্রকাশ করা হয়। ফ্রেমওয়ার্ক কার্নেল থেকে ইউজারস্পেসে এবং ইউজারস্পেস প্রসেসের মধ্যে ড্রাইভারের মধ্যে সিঙ্ক্রোনাইজেশন প্রিমিটিভগুলিকে পাস করার অনুমতি দেয়।

উদাহরণস্বরূপ, একটি অ্যাপ্লিকেশন জিপিইউতে সঞ্চালিত কাজের জন্য সারিবদ্ধ হতে পারে। GPU সেই ছবি আঁকা শুরু করে। যদিও ছবিটি এখনও মেমরিতে আঁকা হয়নি, বাফার পয়েন্টারটি একটি বেড়া সহ উইন্ডো কম্পোজিটরের কাছে পাঠানো হয় যা নির্দেশ করে যে GPU কাজ কখন শেষ হবে। উইন্ডো কম্পোজিটর সময়ের আগে প্রক্রিয়াকরণ শুরু করে এবং ডিসপ্লে কন্ট্রোলারের কাছে কাজটি পাস করে। একইভাবে, সিপিইউ কাজ সময়ের আগে সম্পন্ন হয়। GPU শেষ হয়ে গেলে, ডিসপ্লে কন্ট্রোলার অবিলম্বে ছবিটি প্রদর্শন করে।

সিঙ্ক্রোনাইজেশন ফ্রেমওয়ার্ক বাস্তবায়নকারীদের তাদের নিজস্ব হার্ডওয়্যার উপাদানগুলিতে সিঙ্ক্রোনাইজেশন সংস্থানগুলিকে লিভারেজ করতে দেয়। অবশেষে, ফ্রেমওয়ার্ক ডিবাগিং-এ সাহায্য করার জন্য গ্রাফিক্স পাইপলাইনে দৃশ্যমানতা প্রদান করে।

স্পষ্ট সিঙ্ক্রোনাইজেশন

স্পষ্ট সিঙ্ক্রোনাইজেশন গ্রাফিক্স বাফারের প্রযোজক এবং ভোক্তাদের একটি বাফার ব্যবহার করা শেষ হলে সিগন্যাল দিতে সক্ষম করে। সুস্পষ্ট সিঙ্ক্রোনাইজেশন কার্নেল-স্পেসে প্রয়োগ করা হয়।

সুস্পষ্ট সিঙ্ক্রোনাইজেশনের সুবিধাগুলির মধ্যে রয়েছে:

  • ডিভাইসের মধ্যে আচরণের কম পার্থক্য
  • আরও ভাল ডিবাগিং সমর্থন
  • উন্নত পরীক্ষার মেট্রিক্স

সিঙ্ক ফ্রেমওয়ার্কের তিনটি অবজেক্ট প্রকার রয়েছে:

  • sync_timeline
  • sync_pt
  • sync_fence

সিঙ্ক_টাইমলাইন

sync_timeline হল একঘেয়ে ক্রমবর্ধমান টাইমলাইন যা বিক্রেতাদের প্রতিটি ড্রাইভারের উদাহরণের জন্য প্রয়োগ করা উচিত, যেমন একটি GL প্রসঙ্গ, ডিসপ্লে কন্ট্রোলার, বা 2D ব্লিটার। sync_timeline একটি নির্দিষ্ট হার্ডওয়্যারের জন্য কার্নেলে জমা দেওয়া কাজগুলি গণনা করে। sync_timeline অপারেশনের ক্রম সম্পর্কে গ্যারান্টি প্রদান করে এবং হার্ডওয়্যার-নির্দিষ্ট বাস্তবায়ন সক্ষম করে।

sync_timeline প্রয়োগ করার সময় এই নির্দেশিকাগুলি অনুসরণ করুন:

  • ডিবাগিং সহজ করার জন্য সমস্ত ড্রাইভার, টাইমলাইন এবং বেড়াগুলির জন্য দরকারী নাম প্রদান করুন।
  • ডিবাগিং আউটপুটকে আরও পঠনযোগ্য করতে টাইমলাইনে timeline_value_str এবং pt_value_str অপারেটর প্রয়োগ করুন।
  • ইউজারস্পেস লাইব্রেরি, যেমন GL লাইব্রেরি, প্রাইভেট টাইমলাইন ডেটাতে অ্যাক্সেস দিতে চাইলে ফিল driver_data প্রয়োগ করুন। data_driver বিক্রেতাদের অপরিবর্তনীয় sync_fence এবং sync_pts এর উপর ভিত্তি করে কমান্ড লাইন তৈরি করার জন্য তথ্য পাঠাতে দেয়।
  • ইউজারস্পেসকে স্পষ্টভাবে বেড়া তৈরি বা সংকেত দেওয়ার অনুমতি দেবেন না। সুস্পষ্টভাবে সিগন্যাল/বেড়া তৈরি করার ফলে একটি অস্বীকৃত-অফ-সার্ভিস আক্রমণ হয় যা পাইপলাইনের কার্যকারিতা বন্ধ করে দেয়।
  • সুস্পষ্টভাবে sync_timeline , sync_pt , বা sync_fence উপাদানগুলি অ্যাক্সেস করবেন না৷ API সমস্ত প্রয়োজনীয় ফাংশন প্রদান করে।

sync_pt

sync_pt হল একটি sync_timeline একটি একক মান বা পয়েন্ট। একটি বিন্দুর তিনটি অবস্থা রয়েছে: সক্রিয়, সংকেত এবং ত্রুটি। পয়েন্টগুলি সক্রিয় অবস্থায় শুরু হয় এবং সংকেত বা ত্রুটির অবস্থায় স্থানান্তরিত হয়। উদাহরণস্বরূপ, যখন একটি ইমেজ ভোক্তার আর বাফারের প্রয়োজন হয় না, তখন একটি sync_pt সংকেত দেওয়া হয় যাতে একজন ইমেজ প্রযোজক জানেন যে বাফারে আবার লেখা ঠিক আছে।

sync_fence

sync_fence হল sync_pt মানের একটি সংগ্রহ যার প্রায়ই বিভিন্ন sync_timeline প্যারেন্ট থাকে (যেমন ডিসপ্লে কন্ট্রোলার এবং GPU এর জন্য)। sync_fence , sync_pt , এবং sync_timeline হল প্রধান আদিম যা ড্রাইভার এবং ইউজারস্পেস তাদের নির্ভরতা যোগাযোগ করতে ব্যবহার করে। যখন একটি বেড়া সিগন্যাল হয়ে যায়, বেড়ার আগে জারি করা সমস্ত কমান্ড সম্পূর্ণ হওয়ার গ্যারান্টি দেওয়া হয় কারণ কার্নেল ড্রাইভার বা হার্ডওয়্যার ব্লক ক্রমানুসারে কমান্ডগুলি চালায়।

সিঙ্ক ফ্রেমওয়ার্ক একাধিক ভোক্তা বা প্রযোজককে একটি ফাংশন প্যারামিটারের সাথে নির্ভরতা তথ্যের সাথে যোগাযোগ করে একটি বাফার ব্যবহার করা শেষ হলে সংকেত দেওয়ার অনুমতি দেয়। বেড়াগুলি একটি ফাইল বর্ণনাকারী দ্বারা সমর্থিত এবং কার্নেল স্থান থেকে ব্যবহারকারীস্থানে প্রেরণ করা হয়। উদাহরণস্বরূপ, একটি বেড়াতে দুটি sync_pt মান থাকতে পারে যা বোঝায় যখন দুটি পৃথক চিত্র গ্রাহকরা একটি বাফার পড়া শেষ করে। যখন বেড়া সংকেত করা হয়, চিত্র প্রযোজকরা জানেন যে উভয় ভোক্তাদের গ্রাস করা হয়েছে।

বেড়া, যেমন sync_pt মান, সক্রিয় শুরু করে এবং তাদের পয়েন্টের অবস্থার উপর ভিত্তি করে অবস্থা পরিবর্তন করে। সমস্ত sync_pt মান সংকেত হয়ে গেলে, sync_fence সংকেত হয়ে যায়। যদি একটি sync_pt একটি ত্রুটির অবস্থায় পড়ে, সমগ্র sync_fence একটি ত্রুটির অবস্থা থাকে।

বেড়া তৈরি হওয়ার পরে একটি sync_fence সদস্যতা অপরিবর্তনীয়। একটি বেড়াতে একাধিক বিন্দু পেতে, একটি মার্জ পরিচালিত হয় যেখানে দুটি স্বতন্ত্র বেড়া থেকে বিন্দু তৃতীয় বেড়াতে যোগ করা হয়। যদি এই বিন্দুগুলির একটি মূল বেড়াতে সংকেত দেওয়া হয় এবং অন্যটি না হয়, তবে তৃতীয় বেড়াটিও সংকেত অবস্থায় থাকবে না।

সুস্পষ্ট সিঙ্ক্রোনাইজেশন বাস্তবায়ন করতে, নিম্নলিখিতগুলি প্রদান করুন:

  • একটি কার্নেল-স্পেস সাবসিস্টেম যা একটি নির্দিষ্ট হার্ডওয়্যার ড্রাইভারের জন্য সিঙ্ক ফ্রেমওয়ার্ক প্রয়োগ করে। যে ড্রাইভারদের বেড়া-সচেতন হতে হবে তারা সাধারণত এমন কিছু যা অ্যাক্সেস করে বা হার্ডওয়্যার কম্পোজারের সাথে যোগাযোগ করে। মূল ফাইল অন্তর্ভুক্ত:
    • মূল বাস্তবায়ন:
      • kernel/common/include/linux/sync.h
      • kernel/common/drivers/base/sync.c
    • kernel/common/Documentation/sync.txt এ ডকুমেন্টেশন
    • platform/system/core/libsync কার্নেল স্পেসের সাথে যোগাযোগের জন্য লাইব্রেরি
  • বিক্রেতাকে অবশ্যই HAL-এ validateDisplay() এবং presentDisplay() ফাংশনের পরামিতি হিসাবে উপযুক্ত সিঙ্ক্রোনাইজেশন বেড়া প্রদান করতে হবে।
  • দুটি বেড়া-সম্পর্কিত GL এক্সটেনশন ( EGL_ANDROID_native_fence_sync এবং EGL_ANDROID_wait_sync ) এবং গ্রাফিক্স ড্রাইভারে বেড়া সমর্থন।

কেস স্টাডি: একটি ডিসপ্লে ড্রাইভার প্রয়োগ করুন

সিঙ্ক্রোনাইজেশন ফাংশন সমর্থনকারী API ব্যবহার করতে, ডিসপ্লে বাফার ফাংশন আছে এমন একটি ডিসপ্লে ড্রাইভার তৈরি করুন। সিঙ্ক্রোনাইজেশন ফ্রেমওয়ার্ক বিদ্যমান হওয়ার আগে, এই ফাংশনটি dma-buf অবজেক্টগুলি গ্রহণ করবে, সেই বাফারগুলিকে ডিসপ্লেতে রাখবে এবং বাফারটি দৃশ্যমান হওয়ার সময় ব্লক করবে। যেমন:

/*
 * assumes buffer is ready to be displayed.  returns when buffer is no longer on
 * screen.
 */
void display_buffer(struct dma_buf *buffer);

সিঙ্ক্রোনাইজেশন ফ্রেমওয়ার্কের সাথে, display_buffer ফাংশনটি আরও জটিল। ডিসপ্লেতে একটি বাফার রাখার সময়, বাফারটি একটি বেড়ার সাথে যুক্ত থাকে যা নির্দেশ করে কখন বাফারটি প্রস্তুত হবে। বেড়া পরিষ্কার হওয়ার পরে আপনি সারিবদ্ধ হয়ে কাজ শুরু করতে পারেন।

বেড়া সাফ হওয়ার পরে সারিবদ্ধ করা এবং কাজ শুরু করা কিছুই ব্লক করে না। আপনি অবিলম্বে আপনার নিজের বেড়া ফেরত দেন, যা গ্যারান্টি দেয় কখন বাফারটি ডিসপ্লে থেকে বন্ধ হয়ে যাবে। আপনি বাফারগুলি সারিবদ্ধ করার সাথে সাথে, কার্নেল সিঙ্ক্রোনাইজেশন ফ্রেমওয়ার্কের সাথে নির্ভরতা তালিকাভুক্ত করে:

/*
 * displays buffer when fence is signaled.  returns immediately with a fence
 * that signals when buffer is no longer displayed.
 */
struct sync_fence* display_buffer(struct dma_buf *buffer, struct sync_fence
*fence);

সিঙ্ক ইন্টিগ্রেশন

এই বিভাগটি ব্যাখ্যা করে কিভাবে কার্নেল-স্পেস সিঙ্ক ফ্রেমওয়ার্ককে অ্যান্ড্রয়েড ফ্রেমওয়ার্কের ইউজারস্পেস পার্টস এবং ড্রাইভারদের সাথে একে অপরের সাথে যোগাযোগ করতে হবে। কার্নেল-স্পেস অবজেক্টগুলি ইউজারস্পেসে ফাইল বর্ণনাকারী হিসাবে উপস্থাপন করা হয়।

ইন্টিগ্রেশন কনভেনশন

Android HAL ইন্টারফেস নিয়মাবলী অনুসরণ করুন:

  • যদি API একটি ফাইল বর্ণনাকারী প্রদান করে যা একটি sync_pt উল্লেখ করে, তাহলে বিক্রেতার ড্রাইভার বা HAL API ব্যবহার করে ফাইল বর্ণনাকারীকে বন্ধ করতে হবে।
  • যদি বিক্রেতা ড্রাইভার বা HAL একটি API ফাংশনে একটি sync_pt ধারণ করে এমন একটি ফাইল বর্ণনাকারী পাস করে, তাহলে বিক্রেতা ড্রাইভার বা HAL অবশ্যই ফাইল বর্ণনাকারী বন্ধ করবেন না।
  • বেড়া ফাইল বর্ণনাকারী ব্যবহার চালিয়ে যেতে, বিক্রেতা ড্রাইভার বা HAL অবশ্যই বর্ণনাকারীর নকল করতে হবে।

একটি বেড়া বস্তুর নাম পরিবর্তন করা হয় যখনই এটি বাফার কিউ এর মধ্য দিয়ে যায়। কার্নেল বেড়া সমর্থন বেড়াকে নামের জন্য স্ট্রিং রাখার অনুমতি দেয়, তাই সিঙ্ক ফ্রেমওয়ার্ক উইন্ডোর নাম এবং বাফার সূচক ব্যবহার করে যা বেড়ার নাম দেওয়ার জন্য সারিবদ্ধ করা হচ্ছে, যেমন SurfaceView:0/d/sync এবং বাগ রিপোর্টের আউটপুটে নামগুলি উপস্থিত হওয়ার কারণে এটি একটি অচলাবস্থার উত্স সনাক্ত করতে ডিবাগিং করতে সহায়ক।

ANativeWindow ইন্টিগ্রেশন

ANativeWindow বেড়া সচেতন। dequeueBuffer , queueBuffer , এবং cancelBuffer বেড়া পরামিতি রয়েছে৷

OpenGL ES ইন্টিগ্রেশন

OpenGL ES সিঙ্ক ইন্টিগ্রেশন দুটি EGL এক্সটেনশনের উপর নির্ভর করে:

  • EGL_ANDROID_native_fence_sync EGLSyncKHR অবজেক্টে নেটিভ অ্যান্ড্রয়েড ফেন্স ফাইল বর্ণনাকারী মোড়ানো বা তৈরি করার একটি উপায় প্রদান করে।
  • EGL_ANDROID_wait_sync CPU-সাইডের পরিবর্তে GPU-সাইড স্টলগুলিকে অনুমতি দেয়, GPU-কে EGLSyncKHR এর জন্য অপেক্ষা করে। EGL_ANDROID_wait_sync এক্সটেনশনটি EGL_KHR_wait_sync এক্সটেনশনের মতই।

এই এক্সটেনশনগুলি স্বাধীনভাবে ব্যবহার করতে, সংশ্লিষ্ট কার্নেল সমর্থন সহ EGL_ANDROID_native_fence_sync এক্সটেনশনটি প্রয়োগ করুন। এরপরে, আপনার ড্রাইভারে EGL_ANDROID_wait_sync এক্সটেনশনটি সক্ষম করুন৷ EGL_ANDROID_native_fence_sync এক্সটেনশনটি একটি স্বতন্ত্র নেটিভ ফেন্স EGLSyncKHR অবজেক্ট টাইপ নিয়ে গঠিত। ফলস্বরূপ, বিদ্যমান EGLSyncKHR অবজেক্ট টাইপের ক্ষেত্রে প্রযোজ্য এক্সটেনশনগুলি অবাঞ্ছিত ইন্টারঅ্যাকশন এড়িয়ে EGL_ANDROID_native_fence অবজেক্টে প্রযোজ্য হবে না।

EGL_ANDROID_native_fence_sync এক্সটেনশন একটি সংশ্লিষ্ট নেটিভ ফেন্স ফাইল বর্ণনাকারী অ্যাট্রিবিউট নিয়োগ করে যা শুধুমাত্র তৈরির সময় সেট করা যায় এবং বিদ্যমান সিঙ্ক অবজেক্ট থেকে সরাসরি জিজ্ঞাসা করা যায় না। এই বৈশিষ্ট্যটি দুটি মোডের একটিতে সেট করা যেতে পারে:

  • একটি বৈধ বেড়া ফাইল বর্ণনাকারী একটি EGLSyncKHR অবজেক্টে একটি বিদ্যমান নেটিভ অ্যান্ড্রয়েড ফেন্স ফাইল বর্ণনাকারীকে আবৃত করে।
  • -1 একটি EGLSyncKHR অবজেক্ট থেকে একটি নেটিভ অ্যান্ড্রয়েড ফেন্স ফাইল বর্ণনাকারী তৈরি করে।

নেটিভ অ্যান্ড্রয়েড ফেন্স ফাইল বর্ণনাকারী থেকে EGLSyncKHR অবজেক্ট বের করতে DupNativeFenceFD() ফাংশন কল ব্যবহার করুন। এটি সেট অ্যাট্রিবিউট জিজ্ঞাসা করার মতো একই ফলাফল রয়েছে, তবে এই নিয়ম মেনে চলে যে প্রাপক বেড়াটি বন্ধ করে দেয় (অতএব সদৃশ অপারেশন)। অবশেষে, EGLSyncKHR অবজেক্ট ধ্বংস করা অভ্যন্তরীণ বেড়া বৈশিষ্ট্য বন্ধ করে দেয়।

হার্ডওয়্যার কম্পোজার ইন্টিগ্রেশন

হার্ডওয়্যার কম্পোজার তিন ধরনের সিঙ্ক বেড়া পরিচালনা করে:

  • setLayerBuffer এবং setClientTarget কলগুলিতে ইনপুট বাফারের সাথে অ্যাকুয়ারের বেড়াগুলি পাস করা হয়। এগুলি বাফারে একটি মুলতুবি লেখার প্রতিনিধিত্ব করে এবং সারফেসফ্লিংগার বা HWC রচনা সম্পাদনের জন্য সংশ্লিষ্ট বাফার থেকে পড়ার চেষ্টা করার আগে অবশ্যই সংকেত দেয়।
  • getReleaseFences কল ব্যবহার করে presentDisplay কল করার পরে রিলিজ বেড়াগুলি পুনরুদ্ধার করা হয়। এগুলি একই স্তরে পূর্ববর্তী বাফার থেকে একটি মুলতুবি পড়া প্রতিনিধিত্ব করে। একটি রিলিজ বেড়া সংকেত দেয় যখন HWC আর আগের বাফার ব্যবহার করছে না কারণ বর্তমান বাফারটি ডিসপ্লেতে আগের বাফারটিকে প্রতিস্থাপন করেছে। রিলিজ বেড়াগুলি পূর্ববর্তী বাফারগুলির সাথে অ্যাপে ফেরত পাঠানো হয় যা বর্তমান রচনার সময় প্রতিস্থাপিত হবে৷ অ্যাপটিকে তাদের কাছে ফেরত দেওয়া বাফারে নতুন বিষয়বস্তু লেখার আগে একটি রিলিজ বেড়া সংকেত না হওয়া পর্যন্ত অপেক্ষা করতে হবে।
  • প্রেজেন্ট presentDisplay কলের অংশ হিসাবে বর্তমান বেড়াগুলি ফিরিয়ে দেওয়া হয়, প্রতি ফ্রেমে একটি। বর্তমান বেড়া প্রতিনিধিত্ব করে যখন এই ফ্রেমের কম্পোজিশন শেষ হয়, অথবা পর্যায়ক্রমে, যখন আগের ফ্রেমের কম্পোজিশনের ফলাফল আর প্রয়োজন হয় না। ফিজিক্যাল ডিসপ্লেগুলির জন্য, বর্তমান ফ্রেমটি স্ক্রিনে উপস্থিত হলে presentDisplay বর্তমান বেড়াগুলি প্রদান করে। বর্তমান বেড়াগুলি ফেরত দেওয়ার পরে, প্রযোজ্য হলে সারফেসফ্লিঙ্গার টার্গেট বাফারে আবার লেখা নিরাপদ। ভার্চুয়াল প্রদর্শনের জন্য, আউটপুট বাফার থেকে পড়া নিরাপদ হলে বর্তমান বেড়াগুলি ফেরত দেওয়া হয়।