- 博客(63)
- 资源 (1)
- 收藏
- 关注
原创 Vulkan 学习(14)---- 描述符集
渲染管线的时候需要设置管线布局,它描述了渲染过程中着色器如何访问资源,包括描述符集和推送常量等。描述符集是不能被直接创建的,首先需要从一个特定的缓冲池中被分配得到。这个池子叫做描述符池(对于内存分配效率较低的场合是非常有用的,它可以直接分配出多组描述符而不需要调用全局同步操作。对象,换句话说,它相当于一组描述符的集合,新的描述符就是从这些描述符中分配得到的。),布局指定了描述符的类型,数量,绑定点等信息。每个描述符对应一个资源,代表。的类型,分别创建一个分配。),类似于内存池的概念。注意要定义最大分配的。
2025-02-17 22:00:41
622
原创 Vulkan 学习(13)---- Vulkan Framebuffer&command buffer
每个帧缓存区包含一组图像视图,这些图像视图表示实际的图像资源,可以是颜色附件,深度附件或者模板附件。上执行,可以执行不同类型的工作,包括绑定顶点缓存、绑定流水线、录制渲染通道指令、设置视口和裁切矩形,设置绘制指令,执行。):不能直接提交给队列,必须嵌套在主指令缓存中执行,可以用于记录可重用的指令或者多线程录制指令。每个帧缓冲区的附件和渲染通道的附件描述相对应,它们共同定义了渲染的目标,定义了渲染操作的结构和执行顺序,以及需要的附件的数量、类型和格式。指令缓存的类型主要有两种:主指令缓存和次指令缓存。
2025-02-03 14:39:19
971
原创 Linux 内核学习(5) --- Linux 内核底半部机制
当产生一个中断时,会进入中断处理程序,但中断处理程序必须快速、异步、简单的对硬件做出迅速响应并完成那些时间要求很严格的操作,因此,对于那些其他的、对时间要求相对宽松的任务,就应该推后到中断被激活以后再去运行。函数会一直等待,直到队列中所有的对象都被执行以后才会返回,在等待所有待处理的工作执行的时候,该函数会进入休眠状态,所以 只能在进程上下文使用。默认工作队列中的工作可以在系统的任何一个CPU上执行。这样的函数会有一个工作者线程执行,默认的情况下,允许响应中断,并且不持有任何的锁,如何需要,函数可以睡眠。
2025-01-26 22:00:21
958
1
原创 Linux 内核学习(4) --- devfreq 动态调频框架
现在的Soc由众多的子模块构成,比如CNNDSPISPCPU等,在不同的场景下,并非所有的模块都要保持最高的性能,因此,SoC设计的时候会划分一些电压域,这些电压域内的模块,可以根据具体需要调整电压和频率,从而达到既能实现功能,又能降低功耗的目的不过频率电压并不是随意搭配的,一般情况下,高频对应着高压,低频对应着低压,这是由于晶体管的电器特性决定的Linux内核用对这些设备支持的频率和电压进行描述和管理,CPU的DVFS也就是cpufreq也是基于OPP实现的,但是仅仅支持CPU。
2025-01-26 12:20:27
797
原创 Vulkan 学习(12)---- Vulkan pipeline 创建
渲染管线可以看作是一条生产流水线,定义了从输入顶点到输出图像的所有步骤,它包括一系列固定和可编程阶段,这些阶段按照顺序执行,以完成渲染任务。顶点输入阶段主要是从应用程序传递的顶端缓存区中读取顶点数据,并传递给后续阶段,顶点数据通常包括顶点位置、法线、颜色和纹理坐标等。如颜色、纹理坐标和法线等。开发者编写顶点着色器程序来定义每个顶点的处理逻辑,该阶段是必须启用的,是管线中唯一一个必不可少的阶段。)配置的结构体,用于将顶点数据组装成图元(如点、线、三角形),这些图元会被后续的管线阶段处理。
2025-01-07 22:59:02
750
原创 Linux 内核学习(3) --- 内核中断机制
不可以使用耗时很长的函数,因为中断会关闭调度,中断的优先级高于任何任务的优先级,长时间的中断处理会影响到系统的响应速度,使整个系统的任务无法政策运行,造成很多的任务超时,容易导致很多不可预知的后果。因为中断会关闭调度,中断的优先级高于任何任务的优先级,长时间的中断处理会影响到系统的响应速度,使整个系统的任务无法政策运行,造成很多的任务超时,容易导致很多不可预知的后果。读取到的内容从左到右,分别为:1、逻辑中断号,2、中断在各CPU发生的次数,3、中断所属设备类名称,4、硬件中断号,5、中断处理函数。
2025-01-01 23:01:22
963
原创 Vulkan 学习(11)---- Vulkan RenderPass 创建
Vulkan渲染通道(RenderPass) 定义了整个渲染管线一次执行的过程,包括了渲染所使用的所有资源和操作的描述(比如指定渲染管线的渲染目标,告诉管线要渲染到哪里RenderPass 本质上是一个渲染流程的完整描述(管理渲染流程),包括如何渲染这些数据的元数据和指令,但是不包括实际的数据(图像),通过与结合来获取实际的图像数据在Vulkan编程,RenderPass是必不可少的,它必须包含一个或者多个子通道(SubPass)每个子通道表示一个渲染阶段,并且都是使用RenderPass。
2024-12-22 15:09:47
467
原创 Vulkan 学习(10)---- Vulkan SwapChain 创建
Vulkan交换链(Swapchain)是Vulkan应用程序和窗口系统的一座桥梁,负责将渲染结果呈现给用户换个说法,交换链机制是一种图元绘制结果呈现的机制,它可以将绘制的结果渲染到平台相关的展示窗口/展示层当中(这里我理解和android中的机制类似,可以绘制,同时到显示系统显示)交换链包含一组图像(一般作为渲染目标),这些图像被用于在屏幕上显示渲染的帧注意这里在屏幕上渲染才需要swapchain,如果是离屏渲染,可以直接创建vkImage和,不需要swapchain。
2024-12-22 14:53:04
821
原创 OpenCL 学习(2)---- OpenCL Platform 和 Device
这个函数会得到于 platformID 关联的所有的 OpenCL 设备列表,如果参数 devices 设置为 null,每个平台可能关联到一组计算设备,应用程序通过这些计算设备执行内核程序,使用。来限制(0 < num_entries <= 设备数)设置为 0 和 nullptr 来查询返回值的大小。在得到当前支持platform 的前提下,设置。: 支持定位为核心规范的所有功能的一个子集。会返回设备数,返回的设备数可以用。:支持定位为核心规范的所有功能。会返回当前平台上可用的。
2024-09-22 16:40:59
953
原创 Vulkan 学习(9)---- vkSuraceKHR 创建
中用于渲染表面的对象,是一个平台无关的抽象类型,用于封装与窗口系统相关的表面信息,通过这个对象,是一个平台无关的图形API,这意味着它不能直接与特定的窗口系统(应用程序可以与不同操作系统的窗口系统(比如。对象时,不同的窗口系统需要使用不同的。应用程序在窗口系统中创建和管理表面(可以将渲染结果输出到窗口上。),并和图形硬件交换图像(对象是平台无关的,但是创建。的窗口系统)进行交互。引入了窗口系统集成(
2024-09-22 15:57:43
487
原创 Vulkan 学习(8)---- vkImageView 创建
,可以灵活控制图像视图中每个颜色分量的来源,这对于图像处理非常有用,比如转换颜色格式,调整颜色通道等。图像视图定义了图像格式和访问方式,允许渲染管线和图像进行交互,无论是作为。用于指定如何从源图像中的颜色分量映射到目标图像视图中的颜色分量。比如图像有深度和/或模板信息,你可以选择只包括颜色方面。用于指定需要包含在图像视图中图像。在交换链中,我们需要为每个图像(对象以及访问图像的哪一部分,允许你选择图像的哪些层面和。)创建一个基本的图像视图(),或者包括深度方面 ((图像的特性的层面),
2024-09-22 15:54:06
633
原创 Vulkan 学习(7)---- vkImage 创建
表示图像布局,定义了图像在内存中的组织方式,不同的布局对不同的操作有不同的性能特性,最终目的还是为了提高设备对于该图片的操作效率。更加复杂,因为它们是多维的,有独特的布局和格式信息,可以作为过滤,深度或者模板测试等复杂操作的源或者目标,和。值决定了图像数据在内存中的排列方式,进而影响访问图像数据的效率和方式。可以保证图像在各个方面之间的有效转换,优化性能并避免数据冲突。表示图片资源的宽、高和深度(各维度上的)大小,的重要格式,它用于指定图像数据在内存中的存储布局。用于存储图像数据,支持。
2024-08-25 17:24:10
584
原创 Vulkan 学习(6)---- vkBuffer 创建
表示的是一个线性内存块,这说明它的内存布局是连续的,类似于数组,这种布局适合存储顺序访问的数据,比如 顶点数据和索引数据,也支持随机访问。也就是说,创建的资源只是占用了一个位置,创建了一个句柄,并没有对应存储资源数据的内存,后续要通过。获取缓冲区的内存需求,包括内存大小,对齐要求以及适合的内存类型,注意此API 是查询已经创建的。在设备内存绑定到资源上之前,需要确定使用什么类型的内存,以及资源需要多少内存。对象来表示,是一种用于存储通用数据的资源,可以用来存储顶点数据,索引数据,其中需要重点关注的是。
2024-08-25 16:10:34
539
原创 Vulkan 学习(5)---- Vulkan 内存分配
它对物理设备是直接可见的,物理设备可以直接读取其中的内存区块,设备内存和物理设备之间的关系十分紧密,因此它的性能比宿主机内存更高。将内存管理的工作交给了开发者自己负责,如何分配内存,如何指定内存策略都是由开发者自己决定的,当然处理问题也是由开发者自己负责的。表示该内存类型上分配的内存为缓存类型,Host 端访问缓存的内存类型会比较快,但是非缓存内存总是同步内存(实现宿主机队设备内存的映射访问,这个函数会返回一个虚拟地址的指针,指向映射后的设备内存区域。表示在此内存类型上分配的内存只有物理设备可访问。
2024-08-25 16:05:16
1343
原创 Vulkan 学习(4)---- Vulkan 逻辑设备
创建逻辑设备时,需要指定你希望使用的队列族和队列、启用的扩展、以及一些其他特性,我们通过。举例来说:物理设备可能包含三种队列:图形,计算和传输,但是逻辑设备创建的时候,可以只关联。在某些设备中,优先级越高意味着将会得到更多的执行机会,具体的队列调由设备自身管理,(物理设备)的访问,使得应用程序能够提交命令并管理资源,而无需与物理硬件打交道。必须 是目标物理设备中有效的设备队列族索引,并且。前文创建实例的时候可以设置实例的扩展,在。索引对应的设备队列族中的队列数量。,值越大,优先级越高,其中。
2024-08-18 13:39:54
1141
原创 OpenGL-ES 学习(8) ---- FBO
通过绘制到窗口系统提供的帧缓冲区,然后将帧缓冲区对应的区域复制到纹理来实现渲染到纹理,但是此方法只有在纹理尺寸小于或等于帧缓冲区尺寸才有效。本身不能用于渲染,只有添加了纹理或者纹理缓冲区之后才可以作为渲染目标,而且它仅且提供了三类附着,分别是。来实现渲染到纹理,但是与上下文和窗口系统提供的可绘制表面切换开销也很大,因此,引入了帧缓冲区对象。指的是帧缓冲对象,实际上是一个可以添加缓冲区容器,可以为其添加纹理或者渲染缓冲区对象(这里需要说明的是,在不可以共享的资源中,,可以用作FBO中的颜色、深度和模板附着。
2024-08-18 11:39:35
1394
原创 Vulkan 学习(3)---- Vulkan 物理设备和队列组
,每个队列组这种包含一个或者多个队列,这些队列用于处理不同的任务,比如图形渲染,计算任务和传输操作。的物理硬件,通常是系统的一部分-- 显卡、加速器、数字信号处理器或者其他的组件。执行的关键机制,理解队列组和设备队列的工作原理,有助于更好好的使用。系统里有固定数量的物理设备,每个物理设备都有自己的一组固定的功能。中指定的数量小于系统中的物理设备数量,则。如果所有物理设备成功写入,则会返回。下面函数用于枚举出物理设备所有的。中写入的物理设备不是所有,中,设备队列是一个重要概念,Vulkan 物理设备 (
2024-08-11 16:09:06
987
原创 Vulkan 学习(2)---- Vulkan Instance
的功能扩展,它们允许硬件制造商、平台开发者和第三方提供额外的功能和特性,这些功能和特性不包含在核心。参数是最为重要的核心参数 ,当创建实例时,该参数用于指定此实例环境中 Vulkan 的核心版本号。Layer 主要的特点是模块化,可以根据需要加载和卸载,开发者可以选择在应用程序初始化时启用哪些层。库实例涉及向驱动程序提供应用程序的一些细节,比如应用程序的信息和引擎信息等。这几个值随便设置,甚至可以不设置,空值都可以,这些参数不影响实例的创建。在 windows 上运行,可以看到窗口左上角的帧率信息和。
2024-08-11 16:02:06
1090
原创 C 语言学习(5) ---- 汇编语法基础
其低16位形成了一个原始的 8086 寄存器 AX,读者可以通过寄存器名称 AL 访问 AX 的低字节,通过 AH 访问 AX 的高字节。是一个32位的寄存器,用于处理 32 位的数据,而 AX 是一个 16 位的寄存器,用于处理 16 位的数据。基于原始的 8086 指令集,寄存器是16位宽,而32bit 的。为了保证向后兼容性,新指令集中使用的寄存器是旧的寄存器的超集。正如前面所提到的,不同的汇编器对汇编程序有不同的语法,表示。在汇编中指定寄存器的操作数,需要是以寄存器的名称,比如。
2024-08-04 13:44:35
1331
原创 C++ 学习(2) ---- std::cout 格式化输出
C++ 通常使用cout输出数据,和printf()函数相比,cout实现格式化输出数据的方式更加多样化;一方面,cout 作为ostream类的对象,该类中提供有一些成员方法,可实现对输出数据的格式化;另一方面,为了方面用户格式化输出数据,C++ 标准库专门提供了一个 <iomanip> 头文件,该头文件中包含有大量的格式控制符,也就是流操作算子,使用上更加方便;
2024-08-04 12:12:02
3496
原创 OpenGL-ES 学习(7) ---- VBO EBO 和 VAO
但是如果每次都要绘制相同的图元,就可以把 顶点的值缓存到GPU内存中,不必每次都执行设定加拷贝的过程,这里就可以使用。的编程中,用于绘制图元的顶点数据是从 CPU 传递到显存中的,具体的方式通过。不仅顶点的坐标可以缓存到GPU显存中,不同的顶点构成的。同时缓存了顶点和顶点颜色数据,但是没有使用。这些调用操作,高效的在顶点属性配置之间切换。标志指定的缓冲区对象用于保存顶点数组。缓存进行绘制的代码如下(实际也使用了。VAO 是指顶点数组对象,主要用于管理。对于每个顶点来说,顶点坐标位于前面,
2024-07-20 15:31:18
996
原创 Vulkan 学习(1)---- Vulkan 基本概念和发展历史
用于处理两个或者更多的动作指令同时发生的情况,此时的指令之间可能会产生争夺资源或者依赖于某些内存,该指令用于设置同步事件或者等待事件,插入流水线屏障对象,渲染通道子通道的依赖。的SDK,其中带有很多不同的资源和工具,可以辅助Vulkan程序的开发,这些工具和资源包括Vulkan的加载器,验证层,跟踪和回放工具。描述符集合指的是资源和着色器之间的接口,可以将着色器绑定到资源,比如图像或者缓存,可以将资源内存关联或者绑定到准备使用的着色器的实例上。的系统可以直接查询系统信息,并返回可用的物理设备的数量。
2024-07-07 15:26:55
3217
原创 OpenGL-ES 学习(6)---- 立方体绘制
顶点的坐标体系如下图所示,三维坐标的中心原点位于立方体的中心,但是要特别注意的是,前后方向表示的是Z轴,上下方向表示的是Y轴。会得到经过插值后的每个片元的颜色,并将这个颜色设置为最终的显示,实现的是一个渐变色的效果,数组中表示不同顶点的绘制顺序,每三个顶点构成一个三角形,最后由。这里为立方体的每个顶点定义不同的颜色,同时在。实现了对顶点内容和顶点Index的缓冲。个面,所以绘制立方体本质上就是绘制这。实现了旋转的效果,同时使用。Note: 这里还使用了。
2024-06-23 16:40:11
1016
原创 数据结构和算法(2)---- Stack 的原理和实现
栈(Stack)是仅限于在表尾进行插入和删除的线性表我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何元素的栈称为空栈,栈也被称为先进后出()的线性表,简称LIFO结构栈的机构如下图所示:栈的插入操作,称为进栈,也称为压栈,入栈。类似于子弹压入弹夹栈的弹出操作,称为出栈,有的也叫做弹栈。类型于子弹从弹夹中弹出Stack。
2024-06-23 14:48:44
348
原创 数据结构和算法(1) ---- Queue 的原理和实现
队列(Queue) 是只允许在一端进行插入,在另一端进行删除的线性表队列是一种先进先出()的线性表,简称FIFO), 允许插入的一端称为队尾, 允许删除的一端称为队列头Queue。
2024-06-23 14:40:57
497
原创 OpenGL-ES 学习(6)---- Ubuntu OES 环境搭建
创建窗口并设置上下文,将创建的窗口用于opengl-es上下文,此时opengl-es和系统的窗口系统相关联 , 创建着色器,编译着色器,最近将其链接到一个程序对象。Note: 上面的环境中同时安装了 x11 和 glfw,实际上只需要安装一个自己需要的即可, x11 和 glfw 都是为 OES 环境对接到窗口系统中,在程序主循环中,还添加了计时相关的代码逻辑,在glfw 的模式下,主循环也是跟屏幕刷新率相同也是60Hz, 可以看到每次循环体的执行间隔都是 16.6ms。GLFW初始化和窗口创建。
2024-06-10 11:28:32
659
原创 Linux 内核学习(2) --- regulator 框架
Regulator 指的是稳定器(调压器),有电压稳定器及电流稳定器两种,能够自动维持恒定电流或者电压,其中,电压稳定器在电路中比较常见。从设备驱动的角度来看,regulator的控制比较简单,主要有 enable/disable/ 输出电压或电流大小的控制。Linux利用 regulator framework 对regulator进行管理和控制。由调节器供电的设备被称为消费者(它们消耗调节器提供的电力。大多数调节器可以启用和禁用他们的输出,一些也可以控制他们的输出电压或电流。
2024-04-13 10:23:45
2442
1
原创 Linux 内核学习(1) --- 时钟子系统
使用clk_hw结构向 CCF 框架注册一个时钟设备,返回一个struct clk结构,其中clk_hw结构中 包含了结构,结构包含对时钟操作的具体函数集合为了简化操作,CCF将clock设备抽象为六中不同的类型,并且做了相应的接口封装,比如,对于Gate类型的设备,直接使用等类型的函数就可以进行注册CCF 框架会为每个注册的都分配一个结构,其中包含了操作函数的结构体结构,本质就是关联到init_data中的clk_opsconsumer通过clk_get等函数 获取的struct clk。
2024-04-10 11:38:15
2221
原创 OpenGL-ES 学习(5)---- GPU 基础知识
以绘制地球月球为例子,CPU 把绘制的 Shader、Buffer、贴图以及 Attachment 准备好,所有需要的数据写入显存,然后发送了两个 Draw Call D1, D2。GPU 几何处理调用 Vertex_Shader S1,计算出顶点位置,像素处理调用 Pixel Shader S2 对每一个像素进行着色。Shader S1, S2 和 Vertex Buffer B1 是复用的,但是传的参数不同,贴图 T1, T2 不同,所以绘制出来的东西也不同。
2024-02-25 10:02:24
1612
原创 OpenGL-ES 学习(4)---- OpenGL-ES 坐标体系
从 [l,r] 到 [-1, 1] 的x坐标范围,从 [b,t] 到 [-1,1 ]的y坐标范围和 [-n,-f] 到[-1, 1] 的 z 的坐标范围。透视除法是一种将 3D 坐标变换到 2D 屏幕上的方法,它可以将3D空间中的任意点投影到一个正方体的六个面上,然后去掉那些不在正方体内部的点,得到最终可以显示在屏幕上的点。观察空间(View Space)也被称为 OpenGL-ES 相机空间(定义了相机所在的位置),即从摄像机的角度观察到的空间,它将对象的世界空间的坐标转换为观察者视野前面的坐标。
2024-02-11 13:27:29
1624
原创 OpenGL-ES 学习(3)---- StencilTest
实际原理就是用实际物体的大小作为模版缓冲区,略微放大一下物体,此时比原物体大的部分作为后面的轮廓,再使用模版测试,将模版值不为 1 的地方进行渲染,就可以得到物体的轮廓。,也就是每个Pixel 都会和模板缓冲区的值比较,决定是否要绘制,模板缓冲区保存的是每个像素是否要被更新的标志位。dpfail:如果模板测试通过,但是深度测试失败时将如何更新模板值;dppass:如果深度测试和模板测试都通过,将如何更新模板值。sfail:如果模板测试失败将如何更新模板值;,模版测试发生在深度测试之前。
2024-02-11 11:07:42
1118
原创 OpenGL-ES 学习(2)---- DepthTest
深度测试中,深度冲突现象需要值得注意。原理: 绘制了两张图片,并且设置投影矩阵,使其都绕着 Y 轴旋转,注意这两张图片的初始化的 Z 轴坐标是不一致的,所以会出现不同的深度,此时的深度可以理解为 Camera。开启深度测试后,如果片段通过深度测试,OpenGL-ES 自动在深度缓冲区存储片段的 gl_FragCoord.z 值,如果深度测试失败,那么相应地丢弃该片段。深度缓冲区中包含深度值介于 0.0 和 1.0 之间,物体接近近平面的时候,深度值接近 0.0 ,物体接近远平面时,深度接近 1.0。
2024-02-11 10:35:22
1608
原创 OpenGL-ES 学习(1)---- AlphaBlend
我们也可以通过 glBlendEquation 自定义两个颜色之间的操作符:GL_FUNC_ADD:默认的,彼此元素相加:Cresult=CSrc+ CDst;GL_FUNC_SUBTRACT:彼此元素相减:Cresult=CSrc− CDst;GL_FUNC_REVERSE_SUBTRACT:彼此元素相减,但顺序相反:Cresult=CDst- CSrc;GL_MIN:混合结果的 4 个通道值分别取 2 元素中 4 个通道较小的值;
2024-02-11 09:45:42
1614
原创 程序员基础常识
ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是一套基于拉丁字母的字符编码,一共收录了128个字符,用一个char 类型存储,它等同于国际标准。包含了基本的拉丁字母(英文字母),阿拉伯数字,标点符号(,.!等),特殊符号(@#¥^ &)还有一些有控制功能的字符(一般不会显示出来)ASCII 编码于1967年第一次发布,最后一次更新是在1986 年,迄今为止一共收录了 128 个字符。可打印字符从空格开始。
2023-08-17 19:17:48
344
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人