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 the GL_FRAMEBUFFER or GL_DRAW_FRAMEBUFFER target.
  • The application calls glFramebufferTexture*() or glFramebufferRenderbuffer() 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() or glFinish() to explicitly flush any queued rendering.
  • The application creates a glFenceSync() for some rendering in the current render pass and then calls glClientWaitSync() 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_ATTACHMENTiGL_DEPTH_ATTACHMENTGL_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 VkImagewith 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 的解决方案的更多相关文章

  1. msaa mrt load store action unity

    unity buildin renderpipeline 和lightweight rp 对于开了msaa的rt 的load store action设置失效 buildin的时候set render ...

  2. unity里blit的load store action设置

    做blit的 load store action时 用 setrendertarget做 之后blit 参数用 BuiltinRenderTextureType.CurrentActive https ...

  3. TBDR下msaa 在metal vulkan和ogles的解决方案

    https://developer.arm.com/solutions/graphics/developer-guides/understanding-render-passes/multi-samp ...

  4. vulkan load store and memoryless

    https://www.jendrikillner.com/article_database/ https://community.arm.com/developer/tools-software/g ...

  5. Unordered load/store queue

    A method and processor for providing full load/store queue functionality to an unordered load/store  ...

  6. Load store and memoryless

    metal https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/MTLBestPractice ...

  7. 报错: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 ...

  8. 批量Load/Store指令的寻址方式

    批量Load/Store指令用于实现在一组寄存器和一块连续的内存单元之间传输数据.也称为多寄存器寻址方式,即一条指令可以完成多个寄存器值的传送.这种寻址方式可以用一条指令最多完成传送16个通用寄存器的 ...

  9. 出现错误: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 ...

随机推荐

  1. PCM-FTL

    1. 运行时第一行需要是write 错误位置 trace_stat->sectors += length;

  2. js中函数总结(1)

    8.1函数定义js的函数可以嵌套在其他函数的定义中,这样它们就可以访问它们被定义时所处的作用域中的任何变量.意味着js函数构成了一个闭包:function name(){} 特殊的:函数表达式有时定义 ...

  3. 《MIT 6.828 Lab 1 Exercise 12》实验报告

    本实验的网站链接:MIT 6.828 Lab 1 Exercise 12. 题目 Exercise 12. Modify your stack backtrace function to displa ...

  4. springboot中配置文件使用2

    本文章接上一篇文章:https://www.cnblogs.com/ysq0908/p/11140931.html 1.使用注解@Value获取配置文件的值 注意:上述中的复杂数据封装指:有map等数 ...

  5. ubuntu18下Docker运行springboot项目

    1.springboot项目打成jar包 mvn install 2.编写Dockerfile # 基础镜像使用java FROM java:8 # 作者 #MAINTAINER sk # VOLUM ...

  6. python基础(十)--函数进阶

    嵌套函数 >>> graphic = '三角形' >>> def chang(): graphic = '正方形' def chang1(): #内部嵌套的函数命名 ...

  7. 以太坊再爆高危漏洞!黑客增发ATN 1100万枚token事件始末

    事情发生在5月中旬,ATN技术人员发现Token合约由于存在漏洞受到攻击.不过ATN基金会随后透露,将销毁1100万个ATN,并恢复ATN总量,同时将在主链上线映射时对黑客地址内的资产予以剔除,确保原 ...

  8. 我的第一个python web开发框架(2)——第一个Hello World

    小白中午听完老菜讲的那些话后一直在思考,可想来想去还是一头雾水,晕晕呼呼的一知半解,到最后还是想不明白,心想:老大讲的太高深了,只能听懂一半半,看来只能先记下来,将明白的先做,不明白的等以后遇到再学. ...

  9. php 获取城市ip

    /** * 获取ip城市信息 * CreateBy XueSong * @param string $ip * @return array|bool|mixed */ function getCity ...

  10. C# Base64 操作类

    using System; using System.Text; namespace VWFC.IT.CUP.BLL.Util { /// <summary> /// Base64 too ...