mesa编译器input识别问题2

概述

hlsl源码如下:

struct PSInput
{float4 position : SV_POSITION;float4 color : COLOR;float4 color2 : COLOR2;
};PSInput VS(float4 pos : POSITION, float4 color : COLOR)
{PSInput result;result.position = pos;result.color = color;return result;
}float4 PS(PSInput input) : SV_Target
{return input.color + input.color2;
}

在ps生成nir的时候出现了input的base都是0的情况,具体如下:

nir_lower_io
shader: MESA_SHADER_FRAGMENT
source_sha1: {0x66390dc6, 0x70183d7d, 0x85314169, 0x1ea4ea16, 0x26fa6adc}
internal: false
stage: 4
next_stage: 0
inputs_read: 33-34
outputs_written: 4
subgroup_size: 0
bit_sizes_float: 0x20
bit_sizes_int: 0x20
origin_upper_left: true
inputs: 0
outputs: 0
uniforms: 0
decl_var system INTERP_MODE_NONE none vec4 SV_Position (SYSTEM_VALUE_FRAG_COORD)
decl_var shader_in INTERP_MODE_NONE none vec4 COLOR (VARYING_SLOT_VAR1.xyzw, 0, 0)
decl_var shader_in INTERP_MODE_NONE none vec4 COLOR_2 (VARYING_SLOT_VAR2.xyzw, 0, 0)
decl_var shader_out INTERP_MODE_NONE none vec4 SV_Target (FRAG_RESULT_DATA0.xyzw, 0, 0)
decl_function main (0 params)impl main {con block b0:   // preds:32     %0 = deref_var &COLOR_2 (shader_in vec4)32    %10 = load_const (0x00000000 = 0.000000)32x4  %11 = @load_input (%10) (base=0, range=1, component=0, dest_type=float32, io location=VARYING_SLOT_VAR2 slots=1)  // COLOR_232     %2 = deref_var &COLOR (shader_in vec4)32    %12 = load_const (0x00000000 = 0.000000)32x4  %13 = @load_input (%12) (base=0, range=1, component=0, dest_type=float32, io location=VARYING_SLOT_VAR1 slots=1)  // COLOR32     %4 = fadd %13.x, %11.x32     %5 = fadd %13.y, %11.y32     %6 = fadd %13.z, %11.z32     %7 = fadd %13.w, %11.w32     %8 = deref_var &SV_Target (shader_out vec4)32x4   %9 = vec4 %4, %5, %6, %7@store_deref (%8, %9) (wrmask=xyzw, access=none)return (pass_flags: 0xcd)// succs: b1block b1:
}

其中%11和%13的load_input的base都是0,出现错误。

分析

用mesa源代码编译好,使用mesa编译出现的驱动去绘制三角形。fs源代码如下

#version 430layout(location = 1) in vec4 COLOR;
layout(location = 2) in vec4 COLOR2;
out vec4 FragColor;void main()
{FragColor = COLOR + COLOR2;
}

nir如下:

shader: MESA_SHADER_VERTEX
source_blake3: {0x7338de06, 0x8f93c5b1, 0xe49d7e79, 0xe70d38eb, 0xcfc0ab1f, 0x0f3bb3fd, 0xfc42e485, 0xb2e36f24}
name: GLSL3
internal: false
stage: 0
next_stage: 4
inputs_read: 15,18
outputs_written: 0,33-34
subgroup_size: 1
bit_sizes_float: 0x20
bit_sizes_int: 0x20
flrp_lowered: true
inputs: 2
outputs: 3
uniforms: 0
decl_var shader_in INTERP_MODE_NONE none vec3 aPos (VERT_ATTRIB_GENERIC0.xyz, 0, 0)
decl_var shader_in INTERP_MODE_NONE none vec4 aPos2 (VERT_ATTRIB_GENERIC3.xyzw, 1, 0)
decl_var shader_out INTERP_MODE_NONE none vec4 gl_Position (VARYING_SLOT_POS.xyzw, 0, 0)
decl_var shader_out INTERP_MODE_NONE none vec4 COLOR (VARYING_SLOT_VAR1.xyzw, 1, 0)
decl_var shader_out INTERP_MODE_NONE none vec4 COLOR2 (VARYING_SLOT_VAR2.xyzw, 2, 0)
decl_function main (0 params)impl main {con block b0:   // preds: 32     %0(driver_location=0) = deref_var &aPos (shader_in vec3)32x3   %1 = @load_deref (%0) (access=none)32     %2(driver_location=1) = deref_var &aPos2 (shader_in vec4)32x4   %3 = @load_deref (%2) (access=none)32     %4 = load_const (0x3f800000 = 1.000000 = 1065353216)32x4   %5 = vec4 %1.x, %1.y, %1.z, %432x4   %6 = fadd %5, %332     %7(driver_location=0) = deref_var &gl_Position (shader_out vec4)@store_deref (%7, %6) (wrmask=xyzw, access=none)32     %8(driver_location=1) = deref_var &COLOR (shader_out vec4)@store_deref (%8, %3) (wrmask=xyzw, access=none)32     %9(driver_location=2) = deref_var &COLOR2 (shader_out vec4)@store_deref (%9, %3) (wrmask=xyzw, access=none)// succs: b1 block b1:
}

其中driver_location是自己添加上的,其实就是base。
由上面可以知道,mesa做了处理,说明我们漏掉了一些步骤。

解决

通过调试源码可以知道,添加以下代码可以解决问题。

/* Depending on PIPE_CAP_TGSI_TEXCOORD (st->needs_texcoord_semantic) we* may need to fix up varying slots so the glsl->nir path is aligned* with the anything->tgsi->nir path.*/
static void
st_nir_fixup_varying_slots(/*struct st_context* st, */nir_shader* shader, nir_variable_mode mode)
{//if (st->needs_texcoord_semantic)//    return;/* This is called from finalize, but we don't want to do this adjustment twice. *///assert(!st->allow_st_finalize_nir_twice);nir_foreach_variable_with_modes(var, shader, mode) {if (var->data.location >= VARYING_SLOT_VAR0 && var->data.location < VARYING_SLOT_PATCH0) {var->data.location += 9;}else if (var->data.location == VARYING_SLOT_PNTC) {var->data.location = VARYING_SLOT_VAR8;}else if ((var->data.location >= VARYING_SLOT_TEX0) &&(var->data.location <= VARYING_SLOT_TEX7)) {var->data.location += VARYING_SLOT_VAR0 - VARYING_SLOT_TEX0;}}
}void
st_nir_assign_varying_locations(/*struct st_context* st, */nir_shader* nir)
{/* Lowered IO don't have variables, so exit. */if (nir->info.io_lowered)return;if (nir->info.stage == MESA_SHADER_VERTEX) {nir_assign_io_var_locations(nir, nir_var_shader_out,&nir->num_outputs,nir->info.stage);st_nir_fixup_varying_slots(/*st, */nir, nir_var_shader_out);}else if (nir->info.stage == MESA_SHADER_GEOMETRY ||nir->info.stage == MESA_SHADER_TESS_CTRL ||nir->info.stage == MESA_SHADER_TESS_EVAL) {nir_assign_io_var_locations(nir, nir_var_shader_in,&nir->num_inputs,nir->info.stage);st_nir_fixup_varying_slots(/*st, */nir, nir_var_shader_in);nir_assign_io_var_locations(nir, nir_var_shader_out,&nir->num_outputs,nir->info.stage);st_nir_fixup_varying_slots(/*st, */nir, nir_var_shader_out);}else if (nir->info.stage == MESA_SHADER_FRAGMENT) {nir_assign_io_var_locations(nir, nir_var_shader_in,&nir->num_inputs,nir->info.stage);st_nir_fixup_varying_slots(/*st, */nir, nir_var_shader_in);nir_assign_io_var_locations(nir, nir_var_shader_out,&nir->num_outputs,nir->info.stage);}else if (nir->info.stage == MESA_SHADER_COMPUTE) {/* TODO? */}else {unreachable("invalid shader type");}
}

上面的与st相关的注释是自己加的,后续需要考虑上下文。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/26228.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电子设计新纪元:三品PLM系统在快速变革中的适应性

随着科技的飞速发展&#xff0c;电子行业正经历着前所未有的变革。产品生命周期的缩短、技术迭代的加速以及市场竞争的加剧&#xff0c;都对电子行业提出了更高的管理要求。在这样的背景下&#xff0c;传统的产品数据管理PDM和产品生命周期管理PLM系统显得力不从心。本文将探讨…

Python学习笔记速成版

数据容器 列表的方法-总览 具体操作 元组 定义 相关操作 注意事项 特点 字符串 总览 常用操作 特点 序列 定义 切片操作 Set集合 总览 定义 常用操作 注意事项 字典 总览 定义 常用操作 获取 嵌套 其他操作 summary 通用操作 字符串大小比较 函数进阶 多个返回值 多种传…

Docker面试整理-如何进行Docker镜像的构建和发布?

构建和发布 Docker 镜像是 Docker 使用中的一个常见任务,通常涉及编写 Dockerfile、构建镜像以及将其推送到镜像仓库的过程。以下是构建和发布 Docker 镜像的详细步骤: 1. 编写 Dockerfile 首先,你需要创建一个 Dockerfile,这是一个包含了一系列指令的文本文件,用来告诉 D…

香橙派 AIpro开发板深度测评

笔者从事无人机研发工作有四五年了&#xff0c;最近几年无人机的智能化是个热门的话题&#xff0c;现在的飞控系统已经非常的稳定。自动避障&#xff0c;AI识别这些功能也逐渐成了无人机的标配功能。飞控底层控制系统一般都是单片机&#xff0c;算力有限。因此和AI的结合势必要…

快准稳的文档解析工具,帮助构建性能优越的金融领域知识库问答产品

随着大模型应用落地速度加快&#xff0c;企业级应用相关技术模块日渐成熟&#xff0c;在各个行业领域&#xff0c;企业改革现有业务流程与生产方式、使用AI提高运作效率的可行性大幅度提升。其中&#xff0c;金融行业作为数据密集、更新快速的代表性行业之一&#xff0c;经常与…

大家都在谈数据要素,但数据交易市场惨淡,原因在哪?有解吗?

两周前&#xff0c;我在南宁参加中国计算机学会数据库战略研讨会&#xff0c;与会的专家、学者就数据要素的确权、定价、流通、安全、供需匹配等问题做了很多讨论。由于政府的推动&#xff0c;国家数据局的成立&#xff0c;当前数据资产的热度很高&#xff0c;尤其是大型央企、…

0117__ANSI C、ISO C、Standard 是什么关系

【C语言笔记】什么是ANSI C标准&#xff1f;-腾讯云开发者社区-腾讯云 ANSI C、ISO C、Standard 是什么关系&#xff1f;-CSDN博客 滑动验证页面 滑动验证页面

第十三章 组合模式

目录 1 组合模式介绍 2 组合模式原理 3 组合模式实现 4 组合模式应用实例 5 组合模式总结 1 组合模式介绍 组合模式(Composite Pattern) 的定义是&#xff1a;将对象组合成树形结构以表示整个部分的层次结构.组合模式可以让用户统一对待单个对象和对象的组合. 2 组合模式…

【数理统计】5-假设检验、参数与非参数检验

文章目录 一、前言二、参数检验和非参数检验2.1 卡方检验&#xff08;非参数检验&#xff09;2.1.1 单因素卡方检验例子2.1.2 双因素卡方检验 2.2 t检验&#xff08;参数检验&#xff09;2.2.1 单样本t检验&#xff08;One-Sample t-Test&#xff09;2.2.2 独立样本t检验&#…

Rust reqwest 简明教程

概述 reqwest 是 Rust 中一个非常流行和强大的 HTTP 客户端库&#xff0c;它提供了一种简单的方式来发送 HTTP 请求并处理响应。reqwest 支持阻塞和非阻塞&#xff08;异步&#xff09;请求&#xff0c;使其适合于各种不同的应用场景。在这篇博文中&#xff0c;我们将详细介绍…

【数据分析】统计学基础及Python具体实现

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

查找最佳分数Π

查找分子或分母不大于一亿的分数Π private static final int MAX_N 100000000;private static void findPIByDivider() {Log.d("findPI", "findPIByDivider start MAX_N" MAX_N);long curtime System.currentTimeMillis();double lastRet 1;int selec…

计算机网络 —— 数据链路层(VLAN)

计算机网络 —— 数据链路层&#xff08;VLAN&#xff09; 什么是VLAN为什么要有VLANVLAN如何实现IEEE 802.1Q 我们今天来看VLAN&#xff1a; 什么是VLAN VLAN&#xff08;Virtual Local Area Network&#xff0c;虚拟局域网&#xff09;是一种网络技术&#xff0c;它将一个物…

一颗万能的PD协议芯片,能芯Type-C PD协议芯片“ECP5705”, 它是如何实现PD直流风扇应用呢?

文章目录 文章目录 前言 一、PD风扇方案介绍 二、芯片介绍 三、PD风扇-供电方式 四、能芯科技 PD 协议芯片ECP5705-应用场景 总结 前言 随着USB Type-C接口的普及和PD取电芯片的出现&#xff0c;使得小型家电和电动工具可以通过统一的USB Type-C接口进行充电&#xff0c;极大地…

2024年IntelliJ系列最新专业版安装码教程!(持续更新)

本教程适用于 J B 全系列产品&#xff0c;包括 Pycharm、IDEA、WebStorm、Phpstorm、Datagrip、RubyMine、CLion、AppCode 等。 2018-2024 均适用&#xff01; &#xff08;直接复制&#xff0c;拿走不谢&#xff09; 9H1390TRAK-eyJsaWNlbnNlSWQiOiI5SDEzOTBUUkFLIiwibGljZW…

Threejs-05、设置响应式画布与全屏控制。

1、自适应屏幕大小 你会发现,我们前面写好的代码,在页面尺寸发生改变的时候,并不能自适应的改变尺寸,而出现空白或者滚动条突出的情况。所以监听屏幕大小的改变,来重新设置相机的宽高比例和渲染器的尺寸大小,代码如下: // 监听画面变化,更新渲染画面 window.addEven…

MFC绘图

文章目录 消息组成消息的作用获取消息翻译消息常见消息WM_DESTROYWM_SYSCOMMAND 消息循环的阻塞发送消息字符串资源加速键资源GDI绘图对象-画笔位图绘制文本绘制字体模式对话框动态库特点线程创建线程 互斥事件信号量 消息组成 窗口句柄消息ID消息的两个参数消息产生的时间消息…

公路建设中边坡监测规范解析

边坡是山区公路或高速公路建设中的重要工程&#xff0c;但由于地形、地质等原因&#xff0c;边坡往往存在较高的塌方、滑坡、泥石流等风险。因此&#xff0c;边坡监测成为了十分必要的工作。本文将介绍边坡监测规范&#xff0c;希望能对相关工作者提供一些帮助。 点击输入图片描…

618这些卷王显示器,彻底杀疯了

该说不说&#xff0c;今年取消预售模式的第一个 618 终于让我看到了一些年中购物节该有的样子。 小忆估摸着不少同学的钱包君都有在这段时间被狠狠搜刮一番吧。 趁着活动热度还在&#xff0c;咱们今天再给大家添一把火&#xff0c;带来一期有关显示器的专题。 众所周知&#…

littlefs性能分析提升

littlefs性能分析 分析的目的很简单&#xff1a;希望支持掉电安全&#xff0c;或者说具有奔溃一致性特性的文件系统&#xff0c;他的读写速度能得到提升。如果了解了瓶颈所在&#xff0c;也可触类旁通。 本次分析&#xff0c;使用了大量的对比测试&#xff1a; littlefs读&a…