Load store action in vulkan & ogles 的解决方案
metal的带宽之前的blog有讲
这篇主要是vulkan 和ogles的解决方案
https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkAttachmentDescription.html
typedef struct VkAttachmentDescription {
VkAttachmentDescriptionFlags flags;
VkFormat format;
VkSampleCountFlagBits samples;
VkAttachmentLoadOp loadOp;
VkAttachmentStoreOp storeOp;
VkAttachmentLoadOp stencilLoadOp;
VkAttachmentStoreOp stencilStoreOp;
VkImageLayout initialLayout;
VkImageLayout finalLayout;
} VkAttachmentDescription;
这样 load store action和programmable blending
vulkan上都有对应实现了
(vulkan还能单独操作stencil的load store。。。)
这样 这两步在unity上应该 都是跨平台支持的 不需要分平台支持了
下面就是metal2那些 feature 在vulkan上的实现。。。
这里八成是要分平台写 因为metal里面的那些关键字别的平台又没有对应。。
=======================================================================================
https://developer.arm.com/solutions/graphics/developer-guides/understanding-render-passes/how-render-passes-work
opengl下 上述方案对应的解决方案
ogles是隐式控制pass切换的
- The application calls
glBindFramebuffer()
to change theGL_FRAMEBUFFER
orGL_DRAW_FRAMEBUFFER
target. - The application calls
glFramebufferTexture*()
orglFramebufferRenderbuffer()
to change the attachments of the currently bound draw framebuffer object when the drawing is queued. - The application calls
eglSwapBuffers()
to signal the end of a frame. - The application calls
glFlush()
orglFinish()
to explicitly flush any queued rendering. - The application creates a
glFenceSync()
for some rendering in the current render pass and then callsglClientWaitSync()
to wait on the completion of that work, or an equivalent behavior with a query object
vulkan和metal是显式控制切换的
this means avoiding:
- Reading in older framebuffer values at the start of a render pass if they are going to be overdrawn.
- Writing out values at the end of each render pass which are transient and are only needed for the duration of that render pass.
这两步就是load store
mali gpu
避免tile memory和ddr之间的traffic
这部分的traffic都是带宽 带宽除此之外还包括texture sample
https://developer.arm.com/solutions/graphics/developer-guides/understanding-render-passes/efficient-render-passes
1.避免切出去再切回来
2.尽量合并 共用renderpass
OGLES:
Load
glClear()
glClearBuffer*()
glInvalidateFramebuffer()
Caution: Only the start of tile clear is free. Calling glClear()
or glClearBuffer*()
after the first draw call in a render pass is not free, and this results in a per-fragment clear shader.
For Vulkan, set the loadOp
for each attachment to either of:
VK_ATTACHMENT_LOAD_OP_CLEAR
VK_ATTACHMENT_LOAD_OP_DONT_CARE
Caution: If you call VkCmdClear*()
commands to clear an attachment, or manually use a shader to write a constant color, it results in a per-fragment clear shader. To benefit from the fast fixed-function tile initialization, it is much more efficient to use the render pass loadOp
operations.
不影响最终结果的情况下 mali里面invalidate operation 优于 a clear operation.
Store
用这个 glInvalidateFramebuffer
OpenGL ES, you can notify the driver that an attachment is transient by marking the content as invalid using a call to glInvalidateFramebuffer()
as the last draw call in the render pass.
Note: If you write applications using OpenGL ES 2.0, you must use glDiscardFramebufferExt()
from the [EXT_discard_framebuffer][EXT_dfb] extension.
depth能用这个么。。。GL_COLOR_ATTACHMENTi
, GL_DEPTH_ATTACHMENT
, GL_STENCIL_ATTACHMENT
, and/or GL_DEPTH_STENCIL_ATTACHMENT
....可以 处理depth
这样解决方案就ok了
For Vulkan, set the storeOp
for each transient attachment to VK_ATTACHMENT_STORE_OP_DONT_CARE
. For more efficiency, the application can even avoid allocating physical backing memory for transient attachments by allocating the backing memory using VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT
and constructing the VkImage
with VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT
.
这块是metal里 memoryless在vulkan上的解决方案
depthstencil在vulkan metal上的建议是 别包一起 我们确实遇到这个问题了 就一个mask却把depth一起开了 这种状况是要避免的
-----------------
EXT_discard_framebuffer
这个unity有支持
===================
看了下unity代码 load store action它在ogles里也是支持的
那之后测下msaa下 是否生效就可以了
metal下msaa是不生效的 有bug要修
https://www.cnblogs.com/minggoddess/p/11447389.html
Load store action in vulkan & ogles 的解决方案的更多相关文章
- msaa mrt load store action unity
unity buildin renderpipeline 和lightweight rp 对于开了msaa的rt 的load store action设置失效 buildin的时候set render ...
- unity里blit的load store action设置
做blit的 load store action时 用 setrendertarget做 之后blit 参数用 BuiltinRenderTextureType.CurrentActive https ...
- TBDR下msaa 在metal vulkan和ogles的解决方案
https://developer.arm.com/solutions/graphics/developer-guides/understanding-render-passes/multi-samp ...
- vulkan load store and memoryless
https://www.jendrikillner.com/article_database/ https://community.arm.com/developer/tools-software/g ...
- Unordered load/store queue
A method and processor for providing full load/store queue functionality to an unordered load/store ...
- Load store and memoryless
metal https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/MTLBestPractice ...
- 报错:Unable to load configuration. - action - file:/E:/apache-tomcat-8.0.37/webapps/20161102-struts2-3/WEB-INF/classes/struts.xml:11:73
第一种报错: 严重: Exception starting filter struts2Unable to load configuration. - action - file:/E:/apache ...
- 批量Load/Store指令的寻址方式
批量Load/Store指令用于实现在一组寄存器和一块连续的内存单元之间传输数据.也称为多寄存器寻址方式,即一条指令可以完成多个寄存器值的传送.这种寻址方式可以用一条指令最多完成传送16个通用寄存器的 ...
- 出现错误:Unable to load configuration. - action - file:/E:/Java/Tomcat7.0/apache-tomcat-7.0.68-windows-x64/apache-tomcat-7.0.68/webapps/SSH2Integrate/WEB-INF/classes/struts.xml:8:43
严重: Exception starting filter struts2 Unable to load configuration. - action - file:/E:/Java/Tomcat7 ...
随机推荐
- 学习笔记:CentOS7学习之二十二: 结构化命令case和for、while循环
目录 学习笔记:CentOS7学习之二十二: 结构化命令case和for.while循环 22.1 流程控制语句:case 22.2 循环语句 22.1.2 for-do-done 22.3 whil ...
- js中构造函数与普通函数的区别
构造函数不仅只出现在JavaScript中,它同样存在于很多主流的程序语言里,比如c++.Java.PHP等等.与这些主流程序语言一样,构造函数在js中的作业一样,也是用来创建对象时初始化对象,并且总 ...
- java类和对象详解
类和对象 java 是面向对象的语言 即 万物皆对象c语言是面向过程语言 一.怎么去描述一个对象? (1)..静态的(短时间内不会改变的东西) 例如:外观,颜色,品牌 (2).动态的(动作) 可以干什 ...
- Ural 1298 Knight 题解
目录 Ural 1298 Knight 题解 题意 题解 程序 Ural 1298 Knight 题解 题意 给定一个\(n\times n(1\le n\le8)\)的国际象棋棋盘和一个骑士(基本上 ...
- Fiddler 抓包工具详解
Fiddler是一个蛮好用的抓包工具,可以将网络传输发送与接受的数据包进行截获.重发.编辑.转存等操作.也可以用来检测网络安全.反正好处多多,举之不尽呀!当年学习的时候也蛮费劲,一些蛮实用隐藏的小功能 ...
- Lua模除运算的大坑
问题 对负数进行模除运算遇到的坑,Lua的%运算与C++的%有差异 实践 结论 Lua%运算的基本公式 a % b = a - ( ( a // b ) * b ) 1.在C,C++中 %运算符的取整 ...
- 怎样限制第三方Cookie
使用Cookie的 SameSite 属性. 1. SameSite=Strict; 这个模式下, 服务器将会完全禁止第三方Cookie, 在跨站点时, 任何情况下都不会发送Cookie, 也就是说, ...
- 怎样终止HTTP请求
使用 xhr.abort() var xhr = new XMLHttpRequest(); xhr.open('GET', 'http://www.example.com/page.php', tr ...
- SPOJ-MobileService--线性DP
题目链接 https://www.luogu.org/problemnew/show/SP703 方法一 分析 很显然可以用一个四维的状态\(f[n][a][b][c]\)表示完成第i个任务时且三人 ...
- ReactNative 踩坑笔记
1.fatal error: 'React/RCTBridgeDelegate.h' file not found 这个问题是应为没有安装cocoaPods 所以无法安装ios需要的第三方库.安装co ...