mesa-softpipe


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:视口槽
  • 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

硬件原子寄存器文件


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注