- 博客(551)
- 资源 (22)
- 收藏
- 关注
原创 LLVM - 编译器前端 - 理解BNF(巴科斯-诺尔范式)
BNF(Backus-NaurForm,巴科斯-诺尔范式)是一种用于描述上下文无关文法的形式语言,广泛应用于定义编程语言、协议和文件格式的语法规则。下面是一小段类Pascal编程语言,这个编程语言就可以用BNF描述。用BNF描述编程语言的语法规则之后,就可以根据这个规则生成抽象语法树,这是编译器前端的一个重要数据结构。是编译器的基础。MODULEGcd;END;a:=b;b:=t;END;RETURNa;ENDGCD;ENDGcd.
2025-01-17 22:47:02
3
原创 OpenGL 进阶系列18 - OpenGL SuperBible - alienrain 例子学习
本文学习记录下 alienrain 的实现原理。它模拟了“Alien”图案的雨滴下落效果,并使用了着色器,纹理数组和Uniform Buffer 缓冲区等现代OpenGL接口。下面是代码用到的主要OpenGL 接口以及代码实现分析。
2025-01-13 23:58:24
237
原创 C++编程指南13 - 尽量减少可写数据的共享
数据竞争是多线程编程中常见的一个问题,当多个线程同时访问一个共享的可写数据且至少有一个线程对其进行修改时,就会发送数据竞争。这个规则的核心就是通过减少对可写数据的共享来避免数据竞争。具体来说,如果数据是只读的(用const修饰),那么无论有多少线程访问它,都不会发送数据竞争。常量数据可以在多个线程之间安全地共享,无需额外的同步机制。不可变的数据可以被安全、高效地共享。不可变数据不需要加锁:常量数据不会产生数据竞争。
2025-01-13 23:17:48
325
原创 C++编程指南12 - 避免数据竞争
如果不避免数据竞争,程序的行为将无法得到任何保证,潜在的错误可能持续存在。简单来说,如果两个线程可以同时访问同一个对象(没有同步机制),并且至少有一个线程是写操作(执行非const操作),那么就会发生数据竞争。
2025-01-12 14:39:54
408
原创 驱动开发系列33 - Linux Graphics mesa Intel驱动介绍
mesa 中的 Intel 驱动体系是为支持 Intel GPU 提供图形 API 的硬件实现部分,主要包括 OpenGL、Vulkan等图形接口,Intel驱动实现整体上分为四层:第一层:API 层, 实现 OpenGL 和 Vulkan 接口, src/mesa/main、src/vulkan。第二层:驱动层,实现 OpenGL 和 Vulkan 驱动,连接API和硬件, src/gallium/drivers/iris、src/intel/vulkan/anv。
2025-01-12 00:47:58
279
原创 C语言 - 理解函数栈帧
函数栈帧是函数调用过程中为管理和存储函数相关信息(如局部变量、返回地址等)而在栈上分配的一块内存区域。它是实现函数调用、递归和返回的关键机制。
2025-01-04 22:47:22
375
原创 C++ 并发专题 - std::promise 和 std::future 介绍
std::promise 和 std::future 是C++标准库的两种工具,主要用于实现线程之间的异步通信。它们属于C++并发库的一部分,提供了一种安全,优雅的方式来在线程之间传递结果或状态。std::promise 用于在线程之间传递值或状态,是一种能够在一个线程中存储值(或异常)的对象。常用方法有以下几种:set_value(value) 设置异步操作的结果,通知关联的std::future.set_exception(ex) 设置一个异常,通知关联的 std::future 发生错误。
2025-01-03 23:36:23
453
原创 C++ 并发专题 - 实现一个线程安全的队列
利用 C++ 标准库中的多线程、条件变量、互斥锁等工具来实现一个线程安全的队列,并且使用多个线程来向队列中添加和获取数据。
2024-12-28 23:37:56
217
原创 驱动开发系列32 - Linux Graphics mesa 源码整体介绍
Mesa 由Brian Paul于 1993 年创建,最初是一个基于软件的 OpenGL 实现,目的是提供跨平台的 3D 图形功能。从那时起,Mesa 逐渐发展成为一个功能强大的项目,支持现代图形 API 和硬件。引入Gallium3D框架(2008 年)。支持Vulkan API(2016 年,RADV 驱动)。通过zink驱动实现 OpenGL 和 Vulkan 的互操作。项目代码。
2024-12-28 14:30:52
361
原创 C++编程指南11 - 假设你的代码将作为多线程程序的一部分运行
在编写代码时,应该预先假设代码会被运行在一个多线程环境中,而不是单线程环境。在多线程程序中,多个线程可能同时访问和修改共享资源,因此需要确保代码在这种情况下能够正确运行。在多线程程序中,多个线程可能同时访问和修改共享资源,因此需要确保代码在这种情况下能够正确运行。即使当前程序是单线程的,未来可能会被扩展到多线程场景。假设代码会在多线程中运行,可以提前避免后续改动时引入的问题。这意味着,在设计类时,确保静态成员和单例模式是线程安全的。在编写全局变量或共享资源时,确保访问方式是原子化的或受到适当保护。
2024-12-26 23:35:00
375
原创 驱动开发系列31 - Linux Graphics 调试 mesa 的 glDrawArrays (三)
接着前面驱动开发系列26 - Linux Graphics 调试 mesa 的 glDrawArrays (二)-CSDN博客的文章继续分析下glDrawArrays的实现,本文介绍一下在Gallium3D HW Driver中,驱动如何将绘制命令提交给GPU执行。看下驱动层的执行逻辑:即 draw_vbo 的过程。
2024-12-25 23:44:15
205
原创 驱动开发系列30 - Linux Graphics DRM光标绘制分析
本文分析了 Linux 直接渲染管理器 (DRM) 绘制光标的过程,目的是将 OpenGL 与 DRM 连接,弄清楚整个调用逻辑。本文将详细描述这一过程,介绍如何在图形软件栈中实现光标渲染。整体软件栈的架构图也将展示其中的各个组成部分及其相互关系。drm-cursor是 JeffyCN 提供的一个实现,旨在通过 Linux 的直接渲染管理器 (DRM) 子系统处理硬件光标。它的核心目的是简化光标的加载、移动和更新过程,并优化性能,特别适用于开发人员在处理 DRM 或图形驱动时。代码仓库。
2024-12-15 13:05:10
180
原创 C++ 并发专题 - C++线程同步的几种方法
线程同步是多线程编程中的一个重要概念,它用于控制多个线程之间对共享资源的访问,避免竞态条件(race condition)和数据不一致的问题。线程同步确保在多线程环境中,多个线程访问共享数据时能够按照某种预定的顺序或规则进行,以保证程序的正确性和稳定性。
2024-12-14 22:36:43
368
原创 OpenGL 进阶系列17 - 编译OpenGL SuperBible 7th 超级宝典随书代码
OpenGL 超级宝典》第七版)是一本广受欢迎的 OpenGL 教程书籍,专注于现代 OpenGL 编程。与早期版本相比,第七版完全围绕OpenGL 4.x 核心模式展开,摒弃了过时的固定管线内容,是学习现代 OpenGL 编程的权威资源。本文介绍下随书代码在Windows和Linux上的编译运行方法。
2024-12-14 20:45:46
149
原创 Vulkan入门系列24 - Vulkan中重要的概念和组件总结
Vulkan定义了一个分层的架构,这个架构的组成部分包括:1. Vulkan 应用程序:这是用户编写的应用程序,它们使用Vulkan API 来进行图形和计算操作。2. Vulkan 加载器(Vulkan Loader):Vulkan 加载器负责查找和加载Vulkan 驱动程序,并将应用程序与合适的驱动程序进行连接。它确保正确的驱动程序在运行时被加载。
2024-12-07 09:27:12
74
原创 C++ 并发专题 - std::latch 介绍
是 C++20 引入的一个同步原语,属于线程同步工具的一部分。它可以用于控制多个线程等待,直到某些事件发生为止,适用于需要等待一组线程在继续之前完成某些操作的场景。可以理解为一种“门闩”机制,它使得多个线程等待,直到达到预定的触发条件。其工作方式类似于一个计数器,线程可以通过。比较适合用于那种固定数量的线程同步的场景(如 N 个线程任务执行完之后才继续进行其他操作)。它通常应用于需要等待多个线程完成某项任务后才能继续执行后续操作的场景。操作使计数器递减,直到计数器达到零时,所有等待的线程才会继续执行。
2024-12-06 00:58:25
197
原创 Vulkan入门系列23 - Vulkan SDK 功能介绍
Vulkan SDK 提供了一系列工具和库,用于开发基于 Vulkan 的应用程序,具体安装步骤请参考Vulkan入门系列1- Windows VS2022 开发环境配置CSDN博客。本文主要详细介绍下Vulkan SDK的作用和包含的组件。
2024-12-06 00:29:57
199
原创 C++ 并发专题 - 使用 std::lock 避免多线程死锁
std::lock是 C++11 引入的一个函数,它可以原子性地锁定多个互斥量(mutex),确保在多个线程竞争锁时避免死锁。它的主要用途是在多个互斥量之间避免因不同线程的不同锁定顺序而导致的死锁问题。
2024-12-04 00:01:35
421
原创 Vulkan入门系列22 - GPU Rendering and Multi-Draw Indirect
GPU 渲染与多重间接绘制(GPU Rendering and Multi-Draw Indirect),本文介绍了一种通过将绘制调用生成和视锥剔除的处理过程转移到 GPU 上,从而有效减少 CPU 使用率的技术方案。
2024-11-28 01:24:49
400
原创 OpenGL 进阶系列16 - Multisample Framebuffer Object 介绍
Multisample Framebuffer Object (FBO) 是 OpenGL 提供的一种机制,用于在自定义的帧缓冲中实现多重采样抗锯齿(Multisample Anti-Aliasing, MSAA)。它允许开发者创建一个多重采样的渲染目标,在对场景进行高质量渲染后再解析(resolve)为单一采样的图像。
2024-11-25 23:56:21
379
原创 C++ 编程指南10 - 如果函数不抛出异常,则应声明为 noexcept
对于那些保证不会抛出异常的函数,应该显式地使用noexcept说明符进行标记。在 C++ 中,异常处理是一种用于处理错误的机制。抛出异常会影响程序的性能,因为它需要进行异常的捕获、传播等操作,尤其是在复杂的异常传播路径中,程序的执行效率会受到较大影响。如果编译器知道某个函数不会抛出异常,它可以做出一些优化决策,避免不必要的异常处理开销。例如,编译器可以更有效地生成代码,避免为了异常处理而插入额外的检查逻辑。通过显式标记函数为noexcept,可以确保在调用这些函数时,程序不会在执行过程中意外抛出异常。
2024-11-24 23:09:23
452
原创 C++ 编程指南09 - 如需ABI兼容,则应该使用 C 风格的子集
如果你希望在不同的编译器之间(例如,GCC 和 Clang 或者不同平台之间)共享二进制接口(ABI),那么应该使用 C 风格的子集来编写代码(extern "C")。这是因为 C 语言和 C++ 在 ABI 方面有许多不同,C 语言的ABI通常具有更好的跨编译器兼容性。是应用程序与操作系统或不同编译器之间交互时所遵循的一组规则。它定义了函数调用、参数传递、返回值处理、内存布局等二进制级别的接口。ABI 确保了程序能够在不同的编译器和平台上运行,避免了运行时的不兼容问题。
2024-11-24 22:41:30
353
原创 C++编程指南08 - 尽量避免全局对象的复杂初始化
全局对象是作用域为全局的变量或对象,它们的初始化通常发生在代码程序开始运行时。这种初始化可能涉及:动态分配内存、调用非平凡的构造函数、依赖其他全局对象或动态计算结果。复杂初始化 是指全局对象的初始化逻辑超出简单的常量赋值,比如涉及复杂的函数调用、文件操作、动态分配或资源依赖。
2024-11-24 22:24:39
386
原创 C++编程指南07 - 不要通过裸指针传递所有权
资源所有权指的是对象或资源(如动态分配的内存、文件句柄等)在程序中的管理权,即:谁负责释放资源?以及谁确保资源的生命周期正确?在 C++ 中,错误管理资源所有权可能导致以下问题:(1)资源泄漏:资源被分配但没有被正确释放。(2)悬空指针:资源被释放后指针仍然被访问。(3)重复释放:多个对象尝试释放同一资源。而裸指针(T*)本质上只是一个地址,它不能表达资源的所有权。
2024-11-24 21:58:57
191
原创 C++ 编程指南06 - 不要泄漏任何资源
资源泄漏是指程序在运行过程中分配了某些资源(如内存、文件句柄、网络连接等),但未正确释放或归还,导致这些资源持续占用,无法被其他部分使用。动态分配的内存未释放。打开的文件或网络连接未关闭。锁未正确释放。资源泄漏会导致内存占用增加或系统资源耗尽,最终可能导致程序崩溃或性能问题。
2024-11-24 21:32:36
333
原创 驱动开发系列29 - Linux Graphics Kernel 内核内存管理子系统介绍
Linux 内核的内存管理子系统是操作系统内核的一个核心部分,负责有效地管理和分配系统内存(包括物理内存和虚拟内存)。内存管理的目标是保证系统能够高效且稳定地分配、使用和回收内存,同时提供隔离和保护,以确保不同进程不会相互干扰。虚拟内存(Virtual Memory)虚拟内存是操作系统提供给每个进程的一个抽象内存模型,它让每个进程都认为自己拥有一个连续且独立的内存空间,而实际的物理内存是由操作系统进行管理的。虚拟内存的核心目的是使得多个进程可以共享物理内存资源,同时避免相互干扰。分页(Paging)
2024-11-23 23:08:05
489
原创 C++ 编程指南05 - 编译时检查优于运行时检查
编译时错误检查是C++编程中一条非常重要的原则,它强调了在可能的情况下,应该优先依赖编译时检查(静态检查)而不是运行时检查。这样做的主要目的是提高程序的性能、安全性和可维护性。编译时检查,即在编译过程中,编译器会检查代码中的错误,类型不匹配等问题,并在编译时进行检测。所有的类型安全、语法错误、逻辑错误等都会被编译器在程序运行之前发现并报告。例如,编译器会检查函数参数的类型、变量是否已初始化、数组越界等问题。运行时检查,即是在程序执行过程中,程序运行时进行错误检查或条件判断。
2024-11-23 20:45:17
510
原创 C++ 编程指南04 - 尽量编写静态类型安全的程序
尽量使程序在编译时就能保证类型安全,而不是依赖于运行时的检查。这是为了避免潜在的类型错误,提高程序的健壮性和安全性。类型安全指的是在编程过程中,类型的使用必须是合理的,且不能出现不符合规定的类型转换或操作。在静态类型语言(如 C++)中,类型安全意味着编译器在编译时能确保程序中的类型使用是正确的,不会发生类型不匹配的错误。
2024-11-23 20:16:48
489
原创 C++ 编程指南03 - 代码应该清晰地表达意图
"Express intent"(表达意图)强调代码应该清晰地表达开发者的意图,使代码更易于理解、维护和扩展。通过编写易于理解和传达意图的代码,开发者能够减少潜在的错误,并帮助团队成员更快速地理解和修改代码。
2024-11-23 18:07:48
324
原创 C++ 编程指南02 - 写出符合 ISO C++ 标准的代码
写出符合 ISO C++ 标准的代码,即严格遵循 C++ 语言标准,避免使用编译器特定的扩展或非标准特性。这样做的目的是确保代码的可移植性、可维护性,并减少对特定编译器的依赖。
2024-11-23 17:56:06
288
原创 驱动开发系列28 - Linux Graphics DRM代码分析 - 内部机制
本文介绍DRM的内部机制,这些特性与驱动程序作者和为现有驱动程序添加新功能的开发人员息息相关。首先,我们将介绍一些典型的驱动程序初始化要求,如设置命令缓冲区,创建初始化输出配置和初始化核心服务。随后将更详细介绍核心内部结构,并提供实施说明和示例。DRM层为图形驱动程序提供了多种服务,其中许多服务是由它通过libdrm提供的应用程序接口驱动的。而libdrm是一个封装了大多数DRM ioctls的库。
2024-11-22 22:47:26
624
原创 C++ 并发专题 - 线程安全的单例模式
在C++编程中,call_once是一种机制,用于确保某个函数或代码段在多线程环境下仅被调用一次。这种机制常用于初始化资源、配置全局变量或执行只需执行一次的逻辑。在 C++11 标准中,是由标准库提供的工具,它与配合使用,能够实现线程安全的一次性初始化。
2024-11-18 21:57:51
736
原创 OpenGL 进阶系列15 - 透明物体绘制方法
是一种在渲染透明物体时不依赖于物体深度排序的技术。在传统的透明物体渲染中,物体需要按照距离摄像机的远近进行排序,以确保透明物体正确地被混合显示。然而,这种排序方式会受到遮挡、复杂几何体和大规模场景的影响,导致渲染性能下降。OIT 技术的出现,允许在不显式排序的情况下正确处理透明物体的渲染,进而提高渲染效率,并为实时应用提供可行的解决方案。
2024-11-17 23:56:11
144
原创 OpenGL 进阶系列14 - 曲面细分着色器
OpenGL 曲面细分着色器(Tessellation Shader)是一种用于图形渲染的高级着色器,旨在对图形进行细分处理。它使得开发者能够将粗糙的模型细分成更精细的网格,从而实现更加平滑和细致的表面。曲面细分着色器通过引入两个主要阶段来实现细分:控制着色器、细分着色器和片段着色器。
2024-11-17 23:38:28
324
原创 OpenGL 进阶系列13 - 使用几何着色器
几何着色器(Geometry Shader,简称 GS) 是 OpenGL 渲染管线中的一个可选阶段,它位于 顶点着色器(Vertex Shader) 和 片段着色器(Fragment Shader) 之间。几何着色器的主要作用是从输入的图元(如点、线、三角形)生成更多的图元,或者对输入的图元进行修改。它能够基于原始顶点数据生成新的顶点,或者将一个图元(比如一个三角形)细分成多个图元(如多个三角形),从而增强图形渲染的灵活性和可扩展性。
2024-11-17 23:24:19
200
原创 OpenGL 进阶系列12 - 图像处理技术
OpenGL 图像处理是利用 OpenGL 的图形渲染功能来进行图像的操作、编辑、转换和特效处理。通过 OpenGL 的管线和着色器,可以实现许多高效且复杂的图像处理任务,例如图像模糊、锐化、边缘检测、色彩调整等。
2024-11-17 22:52:47
127
原创 OpenGL 进阶系列11 - 粒子特效(使用 Compute Shader)
在 OpenGL 中,使用计算着色器(Compute Shader)实现粒子系统是一种现代且高效的方式。计算着色器是一种不直接与图形渲染管线(如顶点或片段着色器)连接的着色器,它允许我们执行一些通用计算任务,比如物理模拟、粒子系统更新等。粒子系统模拟通常涉及大量粒子的物理计算和状态更新,这使得计算着色器成为一个理想选择。二:粒子系统的基本概念粒子系统通常用于模拟和渲染大量的动态对象(粒子)。这些粒子可以表现为烟雾、火焰、水花、雨滴等效果。
2024-11-17 22:27:26
238
原创 OpenGL 进阶系列10 - 实现光线跟踪(Ray Tracing)
OpenGL 实现光线跟踪(Ray Tracing)是一个相对复杂但有趣的挑战,通常用于生成高度逼真的图像效果,如反射、折射、阴影等。OpenGL 本身并不是为光线跟踪设计的,但可以通过结合计算着色器和现代 OpenGL 功能实现光线跟踪。光线跟踪的基本思路是从相机(或视点)出发,发射光线并计算这些光线与场景中物体的交点。光线与场景中物体相交的计算。计算交点的光照(基于表面法线、光源位置、材质等)。反射和折射的处理(如果物体是透明或反射的)。
2024-11-17 21:41:38
633
OpenGL Programming Guide (Red Book) 9th Edition Source Code
2024-10-07
Learn LLVM 17 A beginners guide to learnin - Kai Nacke.pdf
2024-07-08
Power and Performance Software Analysis and Optimization pdf
2024-04-09
计算机图形学经典书籍资料-渲染部分
2014-11-06
计算机图形学经典书籍资料-建模部分
2014-11-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅