Android環境下Mesa初始化流程重學習之eglCreateContext

Mesa初始化流程重學習之eglCreateContext


引言

沒有啥好說的了,直接上手擼代碼!總得找點事情干不是!我打工我快樂!我奮斗,我快樂!



一. 核心結構體之間的關聯



在這里插入圖片描述



二. eglCreateContext流程分析

eglCreateContext(...)//src/egl/main/eglapi.c_EGLContext *context;context = disp->Driver->CreateContext(disp, conf, share, attrib_list)//這里的Driver指向_eglDriver,定義在egl_dri2.c中dri2_create_context(...)//Called via eglCreateContext(), drv->CreateContext()struct dri2_egl_context *dri2_ctx;dri2_ctx = malloc(sizeof *dri2_ctx)dri2_ctx->dri_context = dri2_dpy->image_driver->createContextAttribs(...)//image_driver指向driImageDriverExtension,實現在dri_util.c中,指向driCreateContextAttribsreturn &dri2_ctx->base;driCreateContextAttribs(...) //src/gallium/frontends/dri/dri_util.c__DRIcontext *context;context = calloc(1, sizeof *context);context->driScreenPriv = screen;//__DRIscreen *screendri_create_context(...)//src/gallium/frontends/dri/dri_context.c__DRIscreen *sPriv = cPriv->driScreenPriv;struct dri_screen *screen = dri_screen(sPriv);struct dri_context *ctx = NULL;        ctx = CALLOC_STRUCT(dri_context);    cPriv->driverPrivate = ctx;//這個關系,后面必須通過關系圖畫出來ctx->cPriv = cPriv;ctx->sPriv = sPriv;ctx->st = st_api_create_context(&screen->base, &attribs, &ctx_err,st_share);ctx->st->st_manager_private = (void *) ctx;st_api_create_context(...) //src/mesa/state_tracker/st_manager.cstruct st_context *st;struct pipe_context *pipe;pipe = smapi->screen->context_create(smapi->screen, NULL, ctx_flags);//詳見章節2.1st = st_create_context(api, pipe, mode_ptr, shared_ctx,&attribs->options, no_error,!!smapi->validate_egl_image);//詳見章節2.2return &st->iface;

2.1 smapi->screen->context_create的實現

這塊我們在前面分析時,已經提到過了。在vendor里面會進行賦值,如下:

struct pipe_screen *
xxx_gpu_create_screen(struct xxx_gpu_winsys *winsys)
{struct xxx_gpu_screen *screen = CALLOC_STRUCT(xxx_gpu_screen);if (!screen)return NULL;screen->ws = winsys;screen->base.get_name             = xxx_gpu_get_name;screen->base.get_vendor           = xxx_gpu_get_vendor;screen->base.get_device_vendor    = xxx_gpu_get_device_vendor;screen->base.get_param            = xxx_gpu_get_param;screen->base.get_paramf           = xxx_gpu_get_paramf;screen->base.get_shader_param     = xxx_gpu_get_shader_param;screen->base.get_compute_param    = xxx_gpu_get_compute_param;screen->base.get_compiler_options = xxx_gpu_get_compiler_options;screen->base.is_format_supported  = xxx_gpu_is_format_supported;screen->base.get_timestamp   = xxx_gpu_get_timestamp;screen->base.context_create  = xxx_gpu_context_create;screen->base.destroy         = xxx_gpu_destroy_screen;screen->base.fence_reference = xxx_gpu_fence_reference;screen->base.fence_finish    = xxx_gpu_fence_finish;screen->base.fence_get_fd    = xxx_gpu_fence_get_fd;xxx_gpu_screen_resource_init(&screen->base);slab_create_parent(&screen->transfer_pool, sizeof(struct xxx_gpu_transfer), 16);glsl_type_singleton_init_or_ref();return &screen->base;
}

2.2 st_create_context的實現

接著繼續往下看:

xxx_gpu_create_screen(...)//src/gallium/drivers/xxx_gpu/xxx_gpu_screen.cscreen->base.context_create  = xxx_gpu_context_create;xxx_gpu_context_create(...)//src/gallium/drivers/xxx_gpu/xxx_gpu_context.cstruct xxx_gpu_screen *screen = xxx_gpu_screen(pscreen);struct xxx_gpu_context *ctx = CALLOC_STRUCT(xxx_gpu_context);ctx->base.screen = pscreen;ctx->base.priv = priv;ctx->ws = screen->ws;...ctx->base.flush = xxx_gpu_flush;...

我們接著繼續分析_mesa_initialize_context

_mesa_initialize_context

_mesa_initialize_context(...)//src/mesa/main/context.cctx->Driver = *driverFunctions;/* setup the API dispatch tables with all nop functions */ctx->OutsideBeginEnd = _mesa_alloc_dispatch_table(false);_mesa_alloc_dispatch_table(...)//src/mesa/main/context.cstruct _glapi_table *table = _mesa_new_nop_table(numEntries, glthread)//和gl_dispatch分發有關struct _glapi_table *_mesa_new_nop_table(unsigned numEntries, bool glthread){struct _glapi_table *table;table = _glapi_new_nop_table(numEntries);return table;}            return table;_glapi_table *_glapi_new_nop_table(...)//src/mapi/mapi_glapi.cstruct _glapi_table *table;table = malloc(num_entries * sizeof(mapi_func));memcpy(table, table_noop_array, num_entries * sizeof(mapi_func));return table//build-android-aarch64/src/mapi/shared-glapi/glapi_mapi_tmp.h   
static void APIENTRY noopFlush(void)
{noop_warn("glFlush");
}
const mapi_func table_noop_array[] = {...(mapi_func) noopFlush,...
}

我們接著繼續分析st_create_context_priv

st_create_context_priv

st_create_context_priv(...)//src/mesa/state_tracker/st_context.cstruct pipe_screen *screen = pipe->screen;struct st_context *st = CALLOC_STRUCT( st_context);    ctx->st = st;st->ctx = ctx;st->screen = screen;st->pipe = pipe;   _mesa_initialize_dispatch_tables(ctx);_mesa_initialize_dispatch_tables(...) //src/mesa/main/context.c_mesa_init_dispatch(ctx)//build-android-aarch64/src/mapi/glapi/gen/api_exec_init.cZ這個是構建完成以后生成的struct _glapi_table *table = ctx->OutsideBeginEnd;//還記得這個地方是怎么被賦值的嗎SET_Flush(table, _mesa_Flush);//我們以這個實現來進行舉例說明// build-android-arm/src/mesa/main/dispatch.h   
#define SET_Flush(disp, func) do { \void (GLAPIENTRYP fn)(void) = func; \SET_by_offset(disp, _gloffset_Flush, fn); \
} while (0)  #define SET_by_offset(disp, offset, fn) \do { \if ( (offset) < 0 ) { \/* fprintf( stderr, "[%s:%u] SET_by_offset(%p, %d, %s)!\n", */ \/*         __func__, __LINE__, disp, offset, # fn); */ \/* abort(); */ \} \else { \( (_glapi_proc *) (disp) )[offset] = (_glapi_proc) fn; \} \} while(0)

這里的核心是_glapi_table,它在前面已經被初始化了!



mesa 調試 —— 運行時函數棧的打印
Mesa GL Dispatch
mesa調用主線分析與理解

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/18739.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18739.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18739.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

紅酒配餐中的酒杯選擇與使用技巧

在紅酒配餐中&#xff0c;酒杯的選擇與使用技巧是影響品鑒體驗的重要因素。合適的酒杯不僅能展現出紅酒的優雅和風味&#xff0c;還能提升用餐的儀式感和愉悅感。云倉酒莊雷盛紅酒以其卓著的品質和豐富的口感&#xff0c;成為了紅酒愛好者們的首要選擇品牌。下面將介紹在紅酒配…

21張讓你代碼能力突飛猛進Python速查表(神經網絡、線性代數、可視化等)(有中文版)

隨著深度學習的蓬勃發展&#xff0c;越來越多的小伙伴們開始使用python作為主打代碼&#xff0c;python有著種類繁多的第三方庫&#xff0c;這里為大家從網絡上收集了一些代碼速查表&#xff0c;希望可以幫你在碼代碼時提速。 基礎 神經網絡 線性代數 Python資料 可以去VX公…

python標準庫argparse,腳本傳參

argparse 是 Python 的標準庫之一&#xff0c;它用于編寫用戶友好的命令行接口。通過 argparse&#xff0c;你可以很容易地為你的 Python 腳本添加命令行參數和選項&#xff0c;并解析它們。下面是一個簡單的介紹和示例 # 導入庫 import argparse# 定義命令行解析器對象 parse…

JavaScript 日期和時間的格式化

JavaScript 日期和時間的格式化 一、日期和時間的格式化 1、原生方法 1.1、使用 toLocaleString 方法 Date 對象有一個 toLocaleString 方法&#xff0c;該方法可以根據本地時間和地區設置格式化日期時間。例如&#xff1a; const date new Date(); console.log(date.toL…

buuctf_RE

[WMCTF2020]easy_re 簡單輸入flag 但是下斷點后&#xff0c;還沒走幾步就報錯退出了。 確實沒有打印的字符串 main函數也看不懂在干嘛 int __cdecl main(int argc, const char **argv, const char **envp) {__int64 v4; // r13char v5; // r12__int64 v6; // rax_QWORD *v7;…

python計算開始時間到結束時間步長一個小時

為了計算從開始時間到結束時間&#xff0c;每隔一小時的時間間隔&#xff0c;你可以使用Python的datetime模塊來處理日期和時間。以下是一個簡單的例子&#xff0c;它生成從開始時間到結束時間每隔一小時的時間列表。 from datetime import datetime, timedelta# 開始時間 sta…

SylixOS 版本與 RealEvo-IDE 版本對應關系說明

SylixOS 版本與 RealEvo-IDE 版本對應關系說明 SylixOS 版本IDE 版本發布日期1.4.13.1.52017/01/171.5.23.5.12017/10/121.7.13.8.32018/06/221.8.33.9.52018/10/081.9.9-103.9.102020/01/021.11.63.10.22020/05/131.11.73.10.x2020/06/121.12.93.11.02020/09/111.12.11&#…

多輸入多輸出 | MATLAB實現BiTCN(雙向時間卷積神經網絡)多輸入多輸出預測

多輸入多輸出 | MATLAB實現BiTCN(雙向時間卷積神經網絡)多輸入多輸出預測 目錄 多輸入多輸出 | MATLAB實現BiTCN(雙向時間卷積神經網絡)多輸入多輸出預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 Matlab實現BiTCN雙向時間卷積神經網絡多輸入多輸出預測 1.data為數據…

json格式文件備份redis數據庫 工具

背景&#xff1a; 項目組要求使用 json備份redis緩存數據庫內容。 附件里工具是一個包含redis-dump工具的鏡像文件&#xff0c;方便用戶在局域網中使用容器備份redis緩存數據庫。 使用步驟&#xff1a; 解壓tar文件&#xff0c;導入鏡像 docker load < redis_dump_of_my…

【八股系列】HTTP請求特征是什么?

文章目錄 1. HTTP&#xff08;超文本傳輸協議&#xff09;請求具有以下主要特征&#xff1a;1.1 請求行(Request Line):1.2 請求頭(Request Headers):1.3 請求正文(Request Body):1.4 狀態碼(Status Code):1.5 無狀態性(Statelessness):1.6 緩存支持(Cacheability):1.7 方法多樣…

力扣刷題--2535. 數組元素和與數字和的絕對差【簡單】

題目描述 給你一個正整數數組 nums 。 元素和 是 nums 中的所有元素相加求和。 數字和 是 nums 中每一個元素的每一數位&#xff08;重復數位需多次求和&#xff09;相加求和。 返回 元素和 與 數字和 的絕對差。 注意&#xff1a;兩個整數 x 和 y 的絕對差定義為 |x - y| 。…

JWT下token過期的處理策略

策略1 最簡單最直接的方式 用戶再次輸入他們的登錄憑證&#xff0c;如用戶名和密碼&#xff0c;得到一個新的token 策略2 采用單token的方式&#xff1a; 設置 token 過期時間&#xff1b; 前端發起請求&#xff0c;后端驗證 token 是否過期&#xff08;JWT工具類有一個&a…

面試專區|【DevOps-46道DevOps高頻題整理(附答案背誦版)】

簡述什么是 DevOps工作流程 &#xff1f; DevOps工作流程是一種將開發和運維團隊緊密結合起來的方法&#xff0c;旨在實現軟件開發和交付的高效性和可靠性。它強調自動化和持續集成&#xff0c;以便頻繁地進行軟件交付和部署。 DevOps工作流程通常包括以下階段&#xff1a; …

【最優化方法】實驗三 無約束最優化方法的MATLAB實現

實驗的目的和要求&#xff1a;通過本次實驗使學生進一步熟悉掌握使用MATLAB軟件&#xff0c;并能利用該軟件進行無約束最優化方法的計算。 實驗內容&#xff1a; &#xff11;、最速下降法的MATLAB實現 &#xff12;、牛頓法的MATLAB實現 &#xff13;、共軛梯度法的MATLAB…

請簡述vue2和vue3的區別

Vue2和Vue3作為Vue.js框架的兩個主要版本&#xff0c;在多個方面存在顯著的差異。以下是它們之間主要區別的詳細概述&#xff1a; 生命周期函數鉤子&#xff1a; Vue2&#xff1a;包含了一系列的生命周期鉤子函數&#xff0c;如beforeCreate、created、beforeMount等&#xff0…

/lib、/lib64和/usr/local/lib的區別

在Linux系統中&#xff0c;/lib、/lib64 和 /usr/local/lib 這幾個目錄都用于存放庫文件&#xff08;即共享庫或動態鏈接庫&#xff09;&#xff0c;但它們在用途和管理上有一些區別。 /lib 這個目錄通常包含了系統啟動和運行所必需的共享庫。這些庫通常是核心系統組件和關鍵工…

計量和測量的區別有哪些?兩者的關系是什么樣的?

計量和測量在行業內經常被混用&#xff0c;更不用說外行人對計量和測量的定義不夠清晰&#xff0c;無論是看字面還是定義&#xff0c;似乎兩者沒有什么太大的區別&#xff0c;但實際上&#xff0c;兩者還是有區別的&#xff0c;不過又存在千絲萬縷的聯系&#xff0c;那么計量和…

【數據結構】冒泡排序、直接插入排序、希爾排序詳解!

文章目錄 1. 冒泡排序&#x1f34e;2. 直接插入排序&#x1f34e;3. 希爾排序&#xff08;縮小增量排序&#xff09;&#x1f34e; 1. 冒泡排序&#x1f34e; &#x1f427; 基本思想&#xff1a; 比較相鄰的元素。如果第一個比第二個大&#xff0c;就交換他們兩個。 大的數據…

在編程中百分號表示什么:深度解析其多重角色與應用

在編程中百分號表示什么&#xff1a;深度解析其多重角色與應用 在編程的廣闊領域中&#xff0c;百分號&#xff08;%&#xff09;這一看似簡單的符號&#xff0c;實則承載著多重含義與功能。它既是數學運算的得力助手&#xff0c;又是字符串格式化的關鍵工具&#xff0c;甚至在…

Midjourney繪畫關鍵詞參數匯總(一)

在數字藝術和創意設計領域&#xff0c;參數化繪畫技術正日益受到關注。Midjourney作為一家領先的藝術技術公司&#xff0c;推出了一系列繪畫關鍵詞參數&#xff0c;為藝術家和設計師們提供了全新的創作工具。本文將介紹Midjourney繪畫關鍵詞參數的匯總&#xff0c;探索其在數字…