Implement IMUL, PCNT and CONT shader instructions, fix FFMA32I and HFMA32I
Ryujinx能够运行各种各样的自制应用程序,尽管有些程序可能不如其他程序运行得好。MelonDS,一个任天堂DS模拟器向我们介绍了IMUL,PCNT和CONT shader指令,这是我们以前不知道的,最后两个类似于现有的PBK/BRK和SSY/同步对。在实现这些指令的过程中,FMUL32I指令实现在修改的过程中得到了修复,因此第三个操作数应该使用目标寄存器,而不是“SrcC”,因为它对于此指令来说不存在。HFMA32I也存在与上述问题类似的问题,但指令表中也缺少该问题,因此已对其进行了修复。
gdkchan于#2972实施
Fix adjacent 3d texture slices being detected as Incompatible Overlaps
纹理同步带来的巨大变化是相当大的,但出现了一些问题,导致异刃游戏有奇怪的颜色分级。实际上,大多数切片的渲染3D纹理数据都丢失了。
由riperiperi在#2993实施
Fix render target clear when sizes mismatch
在OpenGL和Vulkan上,当绑定的渲染目标具有不同的大小时,它只在所有大小的交集上进行渲染。在GPU上,这种剪辑由ScreenScissorState寄存器对控制。这个寄存器以前经常被忽略,但是为了清除,如果有不同大小的渲染目标,游戏试图清除其中一个,屏幕剪刀大小与被清除的目标匹配,这可能会导致问题。OpenGL会将其裁剪到最小尺寸,而不会清除整个区域。通过强制解除所有其他渲染目标的绑定,以避免主机剪裁,然后使用从屏幕剪裁和用户剪裁(0)计算的自定义剪裁区域,修复了此问题。
修正了没有完全清除屏幕的路径。
之前:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=40b1798303df8db1bc2e7c6c3922dddb/ddd771fbaf51f3dea85ec17fc9eef01f3b29797b.jpg?tbpicau=2024-07-05-05_067b90b9e6b469e95ce334fe99193c09)
之后:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=103e45d10c3d26972ed3085565fab24f/42c9f7f50ad162d942011a074cdfa9ec8b13cd05.jpg?tbpicau=2024-07-05-05_a6c5b9043792434c3c3de52ad88ca9a2)
gdkchan于#2994实施
Add capability for BGRA formats
这增加了一个名为SupportsBgraFormat的新功能。在OpenGL上,它总是为false,因为API不支持BGRA纹理格式。然而,它将在Vulkan上设置为true,这允许我们在那里使用那些格式,而不需要在片段着色器输出上交换组件。这里的主要目标是减少Vulkan分支和current分支之间的差异,这使得审查更加容易。
gdkchan于#3011实施
Stop using glTransformFeedbackVaryings and use explicit layout on the shader
在任天堂Switch上,当在OpenGL上启用该功能时,有两种方法可以指定应写入转换反馈缓冲区的内容。第一个也是我们当前使用的一个是传递着色器输出的名称,使用glTransformFeedbackVaryings函数编写。较新的方法是使用布局限定符在着色器上直接指定它。这种变化实现了后者。原因是Vulkan只支持后者,Vulkan上没有“TransformFeedbackVaryings”函数来指定着色器外部的信息。事实上,这次修改的代码大部分是从Vulkan分支中提取的。因此,这里的主要优势是减少了与Vulkan和Master的差异,这将使审查更容易,并允许我们在两种API上使用相同的方法。这种新方法的一个限制是,例如,不可能将同一个输出写入多个缓冲区(虽然,可能可以创建多个输出并复制值)。但由于游戏也必须指定变换反馈布局,它们也应该受到相同的限制。
gdkchan于#3012实施
Fix deadlock for GPU counter report when 0 draws are done
任天堂Switch上的一些游戏使用所谓的条件渲染,即如果条件为真或假,游戏将呈现不同的用户界面(UI)标记。有时,Ryujinx上会出现一个罕见的错误,即报告包含0个平局的区域的计数器可能会使GPU死锁。如果这个写操作与跟踪操作重叠,那么GPU可能会停止等待它将来要做的事情,所以它会被卡住。以前,它会立即报告并将结果从后端线程写入客户内存(被跟踪)。当后端线程启用时,后端线程不能触发等待GPU的读取操作,因为它可能会等待自己,永远不会前进。在后端多线程的同步映射的情况下,它将尝试等待尚不完全存在的后端同步对象,因为根据GPU和跟踪,同步对象将存在,但它尚未由后端创建。修复方法是像任何其他事件一样对0 draw事件进行排队,它的_bufferMap值被强制为0,它将与计数器队列中的其他事件一起刷新。这修正了超级马里奥奥德赛,马里奥赛车8,Splatoon 2等游戏的条件渲染问题
由riperiperi在#3019实施
Add support for BC1/2/3 decompression (for 3D textures)
ginormous纹理同步更新增加了对使用不支持的压缩格式的不兼容重叠的刷新支持。但是,仅支持BC4和BC5压缩格式。这扩展了它,以支持BC1,BC2和BC3格式。这修复了在OpenGL上使用3D纹理格式的游戏中损坏的纹理。Vulkan没有这个问题,因为它支持3D压缩格式。其他更改包括,添加了新的“Supports3DTextureCompression”功能,在OpenGL上始终为false,但在Vulkan上应设置为true,更改了GpuContext上的Capabilities属性以返回struct ref以避免复制,还将Capabilities struct属性更改为readonly字段,也是为了避免复制。
删除了Bc1Rgb格式。它们没有被使用(事实上它们是非常无用的,因为在RGB和RGBA变量之间没有区别,除了alpha分量被忽略(可以通过将swizzle上的alpha设置为1来完成))最后,优化现有的BC4和BC5解压缩器。这里BC4大约快2.5倍,而BC5大约快2.1倍(使用随机生成的256x256x2 3D纹理进行测试)。
修正了维斯佩里亚传说中的文字。
之前:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=ea211f4d8d160924dc25a213e406359b/9649583e8794a4c221c29f3053f41bd5ac6e390e.jpg?tbpicau=2024-07-05-05_d9f846dc91293dbdd66dd7c5d38cb0d2)
之后:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=05260e3d30224f4a5799731b39f69044/e92d0612632762d040dedca4fdec08fa503dc608.jpg?tbpicau=2024-07-05-05_1b495797219bf02864c925ee027b56d9)