bgfx入门练习2——找出DX,OpenGL驱动切换实现原理
找到驱动切换的代码,自然而然就要找实现的位置了,简单搜了下,原来是GLSL Shader字节码转换到HLSL字节码,正好和Klayge做了相反的工作。
时间上似乎也差不多,Klyage是2014年搞的
http://www.klayge.org/2014/03/25/announces-dxbc2glsl-a-hlsl-bytecode-to-glsl-compiler/
bgfx最老的一个文件.gitattributes显示是3年前,现在是2018年1月,3年前2015年1月或更早,双方谁都没提到过对面,看起来似乎是平行世界。
要么就是当年流行这种东西?不得而知。反正重要是来看看大概是什么位置实现的。
顺便bgfx这代码量也不小,虽然只能算是个图形API封装,达不到游戏引擎级别,但是看到一堆线程,信号啥的直接就想跪了,没这方面基础果然看不习惯。
再顺便,看bgfx这趋势和代码量,似乎有望成为下一个SDL,SFML,加个音频的话我真就用他了...
分析思路是这样的,首先看第1个例子cubes,因为第0个例子只是演示了imgui和自带的debug文本,没什么shader方面的参考价值。
cubes.cpp,128行找到
m_program = loadProgram("vs_cubes", "fs_cubes");

一路跟进,来到bgfx_utils.cpp,99行
static bgfx::ShaderHandle loadShader(bx::FileReaderI* _reader, const char* _name)

这个函数里面有关于DX还是OpenGL的switch分支判定。
但是继续跟却找不到什么头绪了。
接着从bgfx的src文件名看。
发现在renderer下面有shader.cpp,shader_dxbc.cpp等,在DX驱动模式下,
shader_dxbc.cpp的555行看到
int32_t readString(bx::ReaderSeekerI* _reader, int64_t _offset, char* _out, uint32_t _max, bx::Error* _err)

下断点,成功断下来,换到Opengl下无效,可以判断此处应为DX转换代码,顺便BC应该是Byte Code的意思。
之后在堆栈里向上找,找到一处多态调用bgfx.cpp,2405行
case CommandBuffer::CreateShader:
这个分支下面有一句
m_renderCtx->createShader(handle, mem);
就是这里做了多态处理。

继续跟可以发现,如果是OGL,就直接在renderer_gl.cpp中做
m_id = glCreateShader(m_type);
建立GL Shader
如果是DX,从字节码判定,然后在renderer_d3d11.cpp中
CreateVertexShader
CreatePixelShader
CreateComputeShader
之后可能要看看nbody是怎么实现的,话说回来, bgfx也算学习OpenGL Compute Shader的资料了,因为OpenGL这方面的资料实在太少,完全不能打。
DX好歹有个SDK例子和龙书,OpenGL就没看到什么太靠谱的例子。Geometry Shader的例子到是有,做GPU粒子的看过几个也实现了,CS的是真没见过。
顺便发现bgfx只有VS,PS,CS,顶点,像素和计算着色器3种,没有Geometry Shader的实现,不知道是什么原因没实现,但是总给我一种三缺一的不爽,虽然CS,GS很少用,大部分情况只要有VS,PS就够了。
bgfx入门练习2——找出DX,OpenGL驱动切换实现原理的更多相关文章
- 【一起学源码-微服务】Ribbon 源码二:通过Debug找出Ribbon初始化流程及ILoadBalancer原理分析
前言 前情回顾 上一讲讲了Ribbon的基础知识,通过一个简单的demo看了下Ribbon的负载均衡,我们在RestTemplate上加了@LoadBalanced注解后,就能够自动的负载均衡了. 本 ...
- bgfx入门练习1——切换图形API驱动模式DX与OpenGL
翻了下上次编译bgfx是去年2月份的事了,最近正好想试试DX,OpenGL双驱动,看Urho3D和Klayge光封装就头痛,人又懒,写OpenGL时也基本glfw,于是想到bgfx,不如再试试. 发现 ...
- 平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。
题目:平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小. 源码如下: #include <iostream> #include <string.h> #incl ...
- bgfx入门练习3——编译自定义Shader
马个鸡,总算编译过了自定义Shader,在此感谢自己,感谢自己,以及感谢自己.没有自己的努力,我是不可能解决这个问题的,自己真是太叼了.妈的智障!!! 管方那屎一样的make工具根本没用,反正我是折腾 ...
- HDU——3786找出直系亲属(DFS+回溯)
找出直系亲属 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- 我用 Python 找出了删除我微信的所有人并将他们自动化删除了
1. 概述 不知你是否遇到过在微信上给通讯录中的某个人发消息,结果出现了这一幕: 平时一直认为自己的心里素质过硬,不过遇到这种情况 ... 在我缓了半个钟头(半分钟)之后,缓缓拿出了手机,打开微信,找 ...
- Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化
9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...
- 使用T-SQL找出执行时间过长的作业
有些时候,有些作业遇到问题执行时间过长,因此我写了一个脚本可以根据历史记录,找出执行时间过长的作业,在监控中就可以及时发现这些作业并尽早解决,代码如下: SELECT sj.name , ...
- [LeetCode] Find All Numbers Disappeared in an Array 找出数组中所有消失的数字
Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and ot ...
随机推荐
- 第19课 类型萃取(3)_类型选择的traits
1. std::conditional (1)原型:template <bool Cond, class T, class F> struct conditional; //根据条件获取T ...
- 【转】java面试题
http://blog.csdn.net/jackfrued/article/details/44921941 Java面试题转
- MySQL视图-(视图创建,修改,删除,查看,更新数据)
视图是一种虚拟存在的表,对于使用视图的用户来说基本上是透明的.视图并不在数据库中实际存在,行和列数据来自定义视图的查询总使用的表,并且是在使用视图时动态生成的. 视图相对于普通表的优势: 简单:使用视 ...
- SpringMVC 请求全过程漫谈
SpringMVC 请求全过程漫谈 SpringMVC 跟其他的mvc框架一样,如 struts,webwork, 本质上都是 将一个 http 请求(request)进行各种处理, 然后返回resp ...
- jQuery.ajax()调用asp.net后台方法(非常重要)
http://www.cnblogs.com/zxhoo/archive/2011/01/30/1947752.html 用JQuery的$.ajax()可以很方便的调用asp.net的后台方法. 先 ...
- C# 方法参数 out、ref、param 详解
ref和out都对函数参数采用引用传递形式——不管是值类型参数还是引用类型参数,并且定义函数和调用函数时都必须显示生命该参数为 ref/out形式.两者都可以使函数传回多个结果. ref 类似于 PH ...
- EF 6.x实现dynamic动态查询
利用SqlQuery实现动态查询 public static IEnumerable<dynamic> SqlQueryDynamic(this DbContext db, string ...
- 用ActiveX 创建自己的comboBox 控件(一)
新建ActiveX工程ActiveXcomboBox Ok->next->next->next, create control based on 选择combobox, ...
- Javascript中 toFixed
javascript中toFixed使用的是银行家舍入规则. 银行家舍入:所谓银行家舍入法,其实质是一种四舍六入五取偶(又称四舍六入五留双)法. 简单来说就是:四舍六入五考虑,五后非零就进一,五后为零 ...
- Linux网络编程学习(五) ----- 信号(第四章)
1.基本概念 进程阻塞: 进程执行条件得不到满足,就自动放弃CPU资源而进入休眠状态,以等待条件满足,当条件满足时,系统就将控制权还给该进程进行未完成的操作 共享资源: 进程间协调使用的系统资源 锁定 ...