Transform Feedback 引入

Transform Feedback首先是DirectX3D引入的,但在DirectX3D中它不叫TF, 而是叫Stream Output Stage. 它第一次被引入OpenGL是在2006年,但当时是以扩展的形式GL_EXT_transform_feedback引入的,它正式成为OpenGL Required Core Features是在OpenGL 3.0(2008), 在这之后,OpenGL 4.0, 4.2, 4.6又分别引入了一些TF相关的新特性。

Read more »

Talk About

  • OpenGL Extensions有哪些分类?
  • Conformant OpenGL implementation是什么?
  • OpenGL Extensions和OpenGL Versions有什么关系?
  • OpenGL Extensions和conformant OpenGL implementation有什么关系?
Read more »

Installation on the Ubuntu

除了安装 C++ 标准库实现 libstdc++-9, g++-9 这些软件包外,还要安装 g++

dpkg-deb --contents /var/cache/apt/archives/g++_4%3a9.3.0-1ubuntu2_amd64.deb

1
2
3
4
5
6
7
8
9
10
11
12
drwxr-xr-x root/root         0 2020-03-20 21:52 ./
drwxr-xr-x root/root 0 2020-03-20 21:52 ./usr/
drwxr-xr-x root/root 0 2020-03-20 21:52 ./usr/bin/
drwxr-xr-x root/root 0 2020-03-20 21:52 ./usr/share/
drwxr-xr-x root/root 0 2020-03-20 21:52 ./usr/share/doc/
drwxr-xr-x root/root 0 2020-03-20 21:52 ./usr/share/man/
drwxr-xr-x root/root 0 2020-03-20 21:52 ./usr/share/man/man1/
lrwxrwxrwx root/root 0 2020-03-20 21:52 ./usr/bin/g++ -> g++-9
lrwxrwxrwx root/root 0 2020-03-20 21:52 ./usr/bin/x86_64-linux-gnu-g++ -> g++-9
lrwxrwxrwx root/root 0 2020-03-20 21:52 ./usr/share/doc/g++ -> cpp
lrwxrwxrwx root/root 0 2020-03-20 21:52 ./usr/share/man/man1/g++.1.gz -> g++-9.1.gz
lrwxrwxrwx root/root 0 2020-03-20 21:52 ./usr/share/man/man1/x86_64-linux-gnu-g++.1.gz -> g++-9.1.gz

内置宏

编译器会预定义许多宏,尤其在交叉编译时,不同的工具链编译器会定义不同的宏。例如:

  • aarch64
  • __ARM_ARCH_7A
  • __ARM_ARCH_8A
Read more »

DRM driver features

新DRM驱动的特性

  • DRIVER_GEM

使用GEM内存管理器,所有新的驱动都应该支持。

  • DRIVER_MODESET

支持Kernel Modesetting Interfaces

  • DRIVER_RENDER

支持专门的渲染节点, 即**/dev/dri/renderD**

  • DRIVER_ATOMIC

支持所有的Atomic Modesetting用户空间API

  • DRIVER_SYNCOBJ

支持drm_syncobj, 用于渲染命令提交的显式同步。

  • DRIVER_SYNCOBJ_TIMELINE

支持drm_syncobjtimeline特性

旧DRM驱动的特性

  • DRIVER_USE_AGP
  • DRIVER_LEGACY
  • DRIVER_PCI_DMA
  • DRIVER_SG
  • DRIVER_HAVE_DMA
  • DRIVER_HAVE_IRQ
  • DRIVER_KMS_LEGACY_CONTEXT

内核 DRM 子系统是如何维护的

内核 DRM 子系统的代码仓库托管在cgit上,Upstream DRM Subsystem Repository, 这个仓库最主要的两个分支

  • drm-next

    这个分支的补丁包括 DRM 核心和所有 GPU 驱动的新特性

  • drm-fixes

参考

[0] DRM Maintainer Tools

Gallium Framework

-Dgallium-drivers-Ddri-drivers 的区别,以及它们与 -Degl 的关系

从构建的角度看, -Dgallium-drivers-Ddri-drivers 是无关的。

1
2
3
DRI platform:    drm
DRI drivers: no
DRI driver dir: /usr/lib/x86_64-linux-gnu/dri
1
2
3
EGL:             yes
EGL drivers: builtin:egl_dri2 builtin:egl_dri3
EGL/Vulkan/VL platforms: x11 surfaceless drm xcb
1
2
3
Gallium drivers: swrast panfrost
Gallium st: mesa
HUD lmsensors: no
1
2
3
build/src/gallium/targets/dri/libgallium_dri.so
build/src/gallium/targets/dri/8381c20@@gallium_dri@sha/target.c.o
build/src/gallium/targets/dri/8381c20@@gallium_dri@sha/megadriver_stub.c.o
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@startuml
class pipe_loader_device

class pipe_loader_sw_device {
sw_driver_descriptor * dd
.. !GALLIUM_STATIC_TARGETS ..
util_dl_library * lib
..
sw_winsys * ws
int fd
}

class pipe_loader_drm_device {
drm_driver_descriptor * dd
.. !GALLIUM_STATIC_TARGETS ..
util_dl_library * lib
..
int fd
}

pipe_loader_device <|-- pipe_loader_drm_device
pipe_loader_device <|-- pipe_loader_sw_device
@enduml

resource_copy_region

1
2
3
4
5
6
7
8
9
10
11
12
/**
* Copy a block of pixels from one resource to another.
* The resource must be of the same format.
* Resources with nr_samples > 1 are not allowed.
*/
void (*resource_copy_region)(struct pipe_context *pipe,
struct pipe_resource *dst,
unsigned dst_level,
unsigned dstx, unsigned dsty, unsigned dstz,
struct pipe_resource *src,
unsigned src_level,
const struct pipe_box *src_box);

resource_copy_region 只能在 buffer 与 buffer 之间或 texture 与 texture 之间 memcpy, 而且源与目标的 format 必须相同。之所以不能做 buffers 与 textures 之间的 memcpy, 至少是因为缺少 stride 参数。一些硬件(如 nvidia) 可以通过专门的 copy engine 完成这些拷贝,但对于其它硬件可能需要一个 compute shader 去做这些拷贝。另一方面,那些专门的 copy engine 通常是比较慢的,所以只在那些带宽非常有限的 PCIe 传输场景下才有用。如果想利用全部的
VRAM 带宽(甚至 infinity cache bandwidth), 你很可能必须使用 compute shaders.

Shader Object

创建和使用Shader Object的API:

  • GLuint glCreateShader(GLenum shaderType);
  • void glShaderSource(GLuint shader, GLsizei count, const GLchar **string, const GLint *length);
  • void glCompileShader(GLunit shader);
Read more »

Vulkan 是一个低开销、跨平台的二维和三维图形与计算的应用程序接口,由 Khronos 在2015年在 GDC 上首次发布。它旨在提供高效能和更均衡的 CPU 和 GPU 占用,类似于 Direct3D 12 和 AMD Mantle。

在这里主要收集一些与 Vulkan 强相关的一些项目,便于 Vulkan 的学习和使用。

Read more »
0%