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 ...
随机推荐
- 3-hive、sqoop
1.HIVE 1.交互命令 use db_name; create database db_name //创建数据库 create database if not exists db_name //创 ...
- http stream
http stream 博客分类: http://canofy.iteye.com/blog/2097876 j2EE StringBuilder sb = new StringBuilder() ...
- .NET项目中使用PostSharp
PostSharp是一种Aspect Oriented Programming 面向切面(或面向方面)的组件框架,适用在.NET开发中,本篇主要介绍Postsharp在.NET开发中的相关知识,以及一 ...
- leetcode979
搞不定这种递归计算,可能我的头脑是“线性”的,这种一层一层的,想起来太费劲了,想的头发都没了.以后希望能有AI来写这种程序吧,AI不怕掉头发! class Solution(object): def ...
- mongo 副本集
副本集配置文件 dbpath=/hwdata/mongodb/datalogpath=/hwdata/mongodb/logs/master.logpidfilepath=/hwdata/mongod ...
- django admin 设置(转载https://www.cnblogs.com/wumingxiaoyao/p/6928297.html)
Django admin 一些有用的设置 Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制.以下是我最近摸 ...
- docker mysql Exit 1
用laradock启动mysql时,state总是 Exit 1 ,docker-compose build后也没有效果 这时应该在-/.laradock/data(.env的DATA_PATH_HO ...
- javascript隐式原型
上图是js原型关系图. javascript是一种基于对象的编程语言,但它与一般面向对象的编程语言不同,因为它没有class类的概念 什么是原型?? 我们每创建一个函数,它就会自带一个原型函数,这个原 ...
- Beta冲刺——第一天
beta冲刺:第一天 各个成员今日完成的任务 成员 冯晓.马思远 彭辉.王爽 吴琼.郝延婷 今日完成任务 ·参会人员注册代码规范与功能测试 ·网站的前端代码调整 ·代码规范 ·系统功能测试 ·博客撰写 ...
- sonar gitlab+jenkins配置
sonar.projectKey=test-news-activitysonar.projectName=test-news-activitysonar.projectVersion=$BUILD_N ...