mesa框架

参考:Linux图形显示系统之Mesa – 沉默的思想 – 博客园
mesa编译、环境变量及测试程序
mesa编译脚本
添加:-Dgallium-drivers=swrast
环境变量
添加:
export LIBGL_ALWAYS_SOFTWARE=true
export GALLIUM_DRIVER=softpipe
测试程序
#include <GL/glut.h>
#include <GL/glu.h>
void display() {
glBegin(GL_POINTS);
glVertex2f(0.4f, -0.1f);
glEnd();
glFlush(); // Render now
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutCreateWindow("OpenGL Setup Test");
glutInitWindowSize(320, 320);
glutInitWindowPosition(50, 50);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
glBegin基元类型设置

glBegin会触发调用vbo_exec_Begin。在此函数下,把基元类型设置到vbo_exec_contex和dd_function_table的对应字段里。
glVertex2f顶点属性设置

glVertex2f会触发调用vbo_Vertex2f。会设置顶点运行上下文(vbo_exec_contex)的一些参数。vertex[VBO_ATTRIB_MAX*4]存储着顶点属性;*attrptr[VBO_ATTRIB_MAX]指向vertex;*bufferobj是顶点buffer;*buffer_map是顶点buffer的map映射;*buffer_ptr指向*buffer_map。
注意:这时顶点buffer里还没有数据。
glEnd

干了很少的事,只是尝试合并最新两个基元。
glFlush刷新流程
draw流程

softpipe_draw_vbo
功能:softpipe draw的入口。
顶点数据在:pipe->vertex_buffer[i].buffer.resource
转换到:pipe->draw->pt.user.vbuffer[attr].map。
参数:
struct pipe_contex *pipe:上下文
const struct pipe_draw_info *info:绘制参数
draw_pt_arrays
功能:绘制单个实例,运行前端
前端:准备fetch_elts,draw_elts,-例如vsplit
中端:获取、shader、剪辑测试、视口
管道:基元管道:剪辑、线宽等
后端:驱动程序提供的vbuf_render
fetch_pipeline_linear_run
功能:中段处理入口(drawing/primitive pipeline stages)
参数:
struct draw_pt_middle_end *middle:中段
const struct draw_fetch_info *fetch_info:fetch信息
const struct draw_prim_info *in_prim_info:基元信息
顶点数据来自:middle->draw->pt.user.vbuffer[i].map
FETCH_PIPELINE_GENERIC
功能:中段处理,包括:获取顶点数据,运行顶点和几何着色器,stream output发射,裁剪基元(clip)。
参数:
struct draw_pt_middle_end *middle:中段
const struct draw_fetch_info *fetch_info:fetch信息
const struct draw_prim_info *in_prim_info:基元信息
fetch
功能:把用户层的顶点数据转换为标准形式(x,y,z,w)。用户层数据:fetch->draw->pt.user.vbuffer[i].map。转换后数据:fetched_vert_info.verts
参数:
struct pt_fetch *fetch:顶点数据获取
const struct draw_fetch_info *fetch_info:获取参数
char *output:获取后的数据存到这里
draw_pt_emit_linear
功能:把顶点数据转换为屏幕坐标并存到vbuf_render中,并调用绘制基元
顶点数据来自:vert_info->verts->data,
屏幕坐标存到:emit->draw->render->vertex_buffer
sp_vbuf_draw_arrays
功能:根据不同的基元类型调用不同的光栅化函数。
接口:
- struct vbuf_render *vbr:顶点信息,转换为struct softpipe_vbuf_render
struct softpipe_vbuf_render
{
struct vbuf_render base;
struct softpipe_context *softpipe;
struct setup_context *setup; //环境
enum pipe_prim_type prim; //基元类型
uint vertex_size;
uint nr_vertices;
uint vertex_buffer_size;
void *vertex_buffer; //顶点属性(已经是屏幕坐标)
};
- start:顶点开始位置
- nr:顶点数量
sp_setup_point
功能:对点进行光栅化
参数:
- setup:环境
- v0:点屏幕坐标(x, y, z, w)
环境参数:
- struct softpipe_context:softpipe的上下文信息,主要是应用层设置的各种参数(点大小等)
- fs_variant->info:片段着色器信息
- num_inputs:输入参数数量
- psize_slot:顶点着色器输出槽是否包括点大小
- rasterizer->point_size:通过glPointSize设置的点大小
- rasterizer->point_smooth:点抗锯齿是否开启,开启后渲染为圆,否则为正方形
- setup_info:顶点的设置信息,主要包括插值类型
- attrib[fragSlot].src_dedex:顶点着色器输出的槽
- attrib[fragSlot].interp:插值方式
- no_rast:无光栅化
- rasterizer->rasterizer_discard:无光栅化
- layer_slot:层槽,参考:www.khronos.org/opengl/wiki/Geometry_Shader
- viewport_index_slot:视口槽
- fs_variant->info:片段着色器信息
- struct setup_context:设置上下文
- quad[0].input.layer:渲染到哪层
- quad[0].input.viewport_index:渲染到哪个视口
- vprovoke:激发顶点数组
- posCoef:插值系数(z, w)
- coef:插值系数
- quad[0].input.x0:点的光栅化x坐标
- quad[0].input.y0:点的光栅化y坐标
- quad[0].inout.mask:点的Mask值
流程:
顶点位置来自参数v0,根据来自softpipe_contex的参数进行光栅化,把插值信息设置到setup->posCoef, setup->coef,把光栅化后的位置,mask值,coverage值,层,视口,设置到setup->quad[0]。
quad_clip
功能:根据scissor/surface bounds 裁剪
参数:
setup:环境
quad:包括光栅化后的位置及颜色信息
shade_quads
功能:处理quad,调用fragement shader
参数:
struct stage *qs:quad处理阶段
struct quad_header *quads[]:quad数据
unsigned nr:quad个数
exec_run
功能:运行fragment shader,并把数据拷贝到quad中
参数:
const struct sp_fragment_shader_variant:fragment shader 变量
struct tgsi_exec_machine *machine:tgsi运行虚拟机
struct quad_header *quad:quad数据
bool early_depth_test:是否运行早期深度测试
choose_depth_test
功能:根据不同的参数,选择运行不同的深度测试方法
参数:
struct quad_stage *qs:quad处理阶段的状态及方法
struct quad_header *quads[]:quad数据
unsigned nr:quad个数
single_output_color
功能:把颜色拷贝到framebuffer
参数:
struct quad_stage *qs:quad处理阶段的状态及方法
struct quad_header *quads[]:quad数据
unsigned nr:quad个数
softpipe_flush
功能:把渲染后的数据(tile_cache)写到framebuffer中(transfer)
参数:
struct pipe_context *pipe:管线状态
unsigned flags:刷新标志位
struct pipe_fence_handle **fence:fence
st_glflush
功能:把framebuffer的数据显示到屏幕上
参数:
struct gl_context *ctx:gl上下文
TGSI

TGSI — The Mesa 3D Graphics Library latest documentation
TGSI是一种中间语言用于描述着色器。
所有TGSI指令都以任意精度运行浮点四分量向量。一个操作码最多可以有1个目标寄存器DST,有4个源寄存器(src0~src3)或1个源寄存器(src)。
某些指令允许重新解释矢量分量作为整数,其他指令允许解释为双精度双适量分量。
当指令具有标量结果时,结果通常被复制到DST每一个组件。
指令集
- 核心ISA:一些通用计算指令
- 计算ISA:主要用于计算Shader
- 整数ISA:整数运算
- 按位ISA:整数的位操作
- 几何ISA:仅用于几何着色器
- GLSL ISA:是GLSL操作码集的一部分
- 插值ISA:主要用于插值计算
- 双ISA:将四分量向量重新解释为每个分量精度加倍的双分量向量
- 64位整数ISA:将四分量向量重新解释为每个分量中具有64位的双分量向量。
- 资源采样操作码:主要用于SAMPLE
- 资源访问操作码:资源可以是BUFFER, IMAGE或MEMORY
- 无绑定操作码:用于使用无绑定采样器或图像句柄
- 线程间同步操作码:仅在compute中有效
- 原子操作码:ATOM
- 通道间操作码:子组中的每个线程都将收到相同的结果
其他tokens
声明一个寄存器,该寄存器将在指令中作为操作数引用令牌。
File字段包含正在声明的register文件
UsageMask字段指定可以访问哪些寄存器
Local标志指定给定值不用于子例程参数传递
声明可以选择具有ArrayID属性,该属性可以由间接寻址操作数。
声明语义(Semantic)
可以标记Vertex和Fragment Shader输入和输出寄存器使用由name和index组成的语义信息。
如果设置了Semantic bit,则遵循Declaration token
- TGSI_SEMANTIC_POSITION:对于顶点着色器为输出寄存器,包含Clip中的齐次顶点位置;对于片段着色器为输入寄存器,包含窗口位置
- TGSI_SEMANTIC_COLOR:顶点着色器输出或片段着色器输入/输出
- TGSI_SEMANTIC_BCOLOR:背面颜色仅用于背面多边形,并且仅有效在Vertex Shader输出中
- TGSI_SEMANTIC_FOG:顶点着色器输入/输出,片段着色器输入,表示雾坐标
- TGSI_SEMANTIC_PSIZE:顶点着色器输入/输出,点大小
- TGSI_SEMANTIC_TEXCOORD:顶点着色器输出,片段着色器输入,点精灵纹理坐标
- TGSI_SEMANTIC_PCOORD:片段着色器输入,sprite坐标
- TGSI_SEMANTIC_GENERIC:所有顶点/片段着色器输入/输出未使用其他语义的标签
- TGSI_SEMANTIC_NORMAL:顶点着色器输入,法线向量
- TGSI_SEMANTIC_FACE:片段着色器输入,正反面
- TGSI_SEMANTIC_EDGEFLAG:顶点着色器输入/输出,边缘标记
- TGSI_SEMANTIC_STENCIL:片段着色器,模板参考值
- TGSI_SEMANTIC_VIEWPORT_INDEX:几何着色器,视口索引
- TGSI_SEMANTIC_LAYER:几何着色器, 层
- TGSI_SEMANTIC_CLIPDIST:裁剪距离
- TGSI_SEMANTIC_SAMPLEID:片段着色器,样本ID
- TGSI_SEMANTIC_SAMPLEPOS:片段着色器,样本位置
- TGSI_SEMANTIC_SAMPLEMASK:片段着色器,采样位置
- TGSI_SEMANTIC_INVOCATIONID:几何着色器,当前着色器的调用索引
- TGSI_SEMANTIC_INSTANCEID:顶点着色器,当前实例ID
- TGSI_SEMANTIC_VERTEXID:顶点着色器,当前顶点ID(gl_VertexID)
- TGSI_SEMANTIC_VERTEXID_NOBASER:顶点着色器,当前顶点ID(不包含基础顶点)
- TGSI_SEMANTIC_BASEVERTEX:顶点着色器,包含基础顶点(gl_BaseVertex)
- TGSI_SEMANTIC_PRIMID:几何和片段着色器,基元ID
- TGSI_SEMANTIC_PATCH:曲面细分计算/控制着色器,per-patch属性
- TGSI_SEMANTIC_TESSCOORD:镶嵌计算着色器,顶点坐标
- TGSI_SEMANTIC_TESSOUTER:镶嵌计算/控制着色器,外部镶嵌的级别
- TGSI_SEMANTIC_TESSINNER:镶嵌计算/控制着色器,补丁的内部镶嵌级别
- TGSI_SEMANTIC_VERTICESIN:镶嵌计算/控制着色器,Input Patch中的顶点数
- TGSI_SEMANTIC_HELPER_INVOCATION:片段着色器,当前调用是否被覆盖(gl_HelperInvocation)
- TGSI_SEMANTIC_BASEINSTANCE:顶点着色器,基实例参数
- TGSI_SEMANTIC_DRAWID:顶点着色器,绘制索引(glMultiDraw*)
- TGSI_SEMANTIC_WORK_DIM:OpenCL启动的计算着色器,work_dim参数
- TGSI_SEMANTIC_GRID_SIZE:计算着色器,最大(x, y, z)维度的线程块网络
- TGSI_SEMANTIC_BLOCK_ID:计算着色器,块ID
- TGSI_SEMANTIC_BLOCK_SIZE:计算着色器,块大小
- TGSI_SEMANTIC_THREAD_ID:计算着色器,线程ID
- TGSI_SEMANTIC_SUBGROUP_SIZE:子组大小
- TGSI_SEMANTIC_SUBGROUP_INVOCATION:其子组中当前调用的索引
- TGSI_SEMANTIC_SUBGROUP_EQ_MASK:子组位掩码
- TGSI_SEMANTIC_SUBGROUP_GE_MASK:
- TGSI_SEMANTIC_SUBGROUP_GT_MASK
- TGSI_SEMANTIC_SUBGROUP_LE_MASK
- TGSI_SEMANTIC_SUBGROUP_LT_MASK
- TGSI_SEMANTIC_VIEWPORT_MASK:将当前基元广播到视口的位掩码(GL_NV_viewport_array2)
- TGSI_SEMANTIC_TESS_DEFAULT_OUTER_LEVEL:default_outer_level
- TGSI_SEMANTIC_TESS_DEFAULT_INNER_LEVEL:default_inner_level
声明插值
此令牌仅对片段着色器INPUT声明有效
Interpolate字段指定输入的插值方式,rasterizer或TGSI_INTERPOLATE_*
Location字段指定像素内的位置
声明Sampler View
声明Resource
硬件原子寄存器文件