diff --git a/.github/workflows/run_test_cases.yml b/.github/workflows/run_test_cases.yml index 11d1598585d..48afab9b9a7 100644 --- a/.github/workflows/run_test_cases.yml +++ b/.github/workflows/run_test_cases.yml @@ -104,9 +104,9 @@ jobs: shell: bash run: | set -x - AUTOTEST_VERSION="v3.7" - TEST_PROJECTS_EXTERNAL="../../cocos-test-projects" - CCTEST_PLUGINS="../../TestAction" + AUTOTEST_VERSION=`echo ${{ steps.parse_pr.outputs.pr_base_ref }} | cut -b -4` + TEST_PROJECTS_EXTERNAL="E:/pr-test/cocos-test-projects" + CCTEST_PLUGINS="E:/pr-test/TestPlugin" if [ ! -d $TEST_PROJECTS_EXTERNAL ]; then mkdir -p $TEST_PROJECTS_EXTERNAL git clone https://github.com/cocos/cocos-test-projects.git $TEST_PROJECTS_EXTERNAL @@ -118,9 +118,7 @@ jobs: git -C $TEST_PROJECTS_EXTERNAL checkout origin/$AUTOTEST_VERSION git -C $TEST_PROJECTS_EXTERNAL pull origin $AUTOTEST_VERSION --allow-unrelated-histories rm -rf $TEST_PROJECTS_EXTERNAL/extensions/automation-framework - 7z x -y $CCTEST_PLUGINS/*.zip -o $TEST_PROJECTS_EXTERNAL/extensions/automation-framework - - + 7z x -y $CCTEST_PLUGINS/*.zip -o$TEST_PROJECTS_EXTERNAL/extensions/automation-framework macOS-RunTestCases: if: | contains(github.event.pull_request.body, '[X] needs automatic test cases check') || @@ -166,7 +164,6 @@ jobs: echo "${{ steps.parse_pr.outputs.pr_head_sha }}" echo "${{ steps.parse_pr.outputs.pr_base_ref }}" echo "${{ steps.parse_pr.outputs.pr_base_sha }}" - - name: Checkout engine uses: actions/checkout@v3 with: @@ -218,9 +215,9 @@ jobs: shell: bash run: | set -x - AUTOTEST_VERSION="v3.7" + AUTOTEST_VERSION=`echo ${{ steps.parse_pr.outputs.pr_base_ref }} | cut -b -4` TEST_PROJECTS_EXTERNAL="../../cocos-test-projects" - CCTEST_PLUGINS="../../TestAction" + CCTEST_PLUGINS="../../TestPlugin" if [ ! -d $TEST_PROJECTS_EXTERNAL ]; then mkdir -p $TEST_PROJECTS_EXTERNAL git clone https://github.com/cocos/cocos-test-projects.git $TEST_PROJECTS_EXTERNAL @@ -233,21 +230,55 @@ jobs: git -C $TEST_PROJECTS_EXTERNAL pull origin $AUTOTEST_VERSION --allow-unrelated-histories rm -rf $TEST_PROJECTS_EXTERNAL/extensions/automation-framework unzip -oq $CCTEST_PLUGINS/*.zip -d $TEST_PROJECTS_EXTERNAL/extensions/automation-framework - Creator-PR-RunTestCases: runs-on: self-hosted-mac needs: [macOS-RunTestCases, Win-RunTestCases] steps: + - name: Get PR Number + id: get_pr + shell: pwsh + run: | + if ("${{ github.event_name }}" -eq "issue_comment") { + Write-Host "::set-output name=pr_number::${{ github.event.issue.number }}" + } + else { + Write-Host "::set-output name=pr_number::${{ github.event.pull_request.number }}" + } + - name: Get PR Details + id: pr_deatils + uses: octokit/request-action@v2.x + with: + route: GET /repos/cocos/cocos-engine/pulls/${{ steps.get_pr.outputs.pr_number }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Parse Pull Request + id: parse_pr + shell: pwsh + run: | + $pull_request = @" + ${{ steps.pr_deatils.outputs.data }} + "@ | ConvertFrom-Json + Write-Host $pull_request + Write-Host "::set-output name=pr_html_url::$($pull_request.html_url)" + Write-Host "::set-output name=pr_author::$($pull_request.user.login)" + Write-Host "::set-output name=pr_head_ref::$($pull_request.head.ref)" + Write-Host "::set-output name=pr_head_sha::$($pull_request.head.sha)" + Write-Host "::set-output name=pr_base_ref::$($pull_request.base.ref)" + Write-Host "::set-output name=pr_base_sha::$($pull_request.base.sha)" + - name: Check Job Parameter + run: | + echo "${{ steps.parse_pr.outputs.pr_head_ref }}" + echo "${{ steps.parse_pr.outputs.pr_head_sha }}" + echo "${{ steps.parse_pr.outputs.pr_base_ref }}" + echo "${{ steps.parse_pr.outputs.pr_base_sha }}" - name: Run test cases timeout-minutes: 90 id: run_test_cases run: | - sed -x - node ../../test-projects/extensions/automation-framework/node_modules/@cctest/scheduler/dist/cli.js cicd -p PR-TEST -v ${{ steps.parse_pr.outputs.pr_base_ref }} -r test-cctest.cocos.org - JOBID='cat ../../test-projects/extensions/automation-framework/node_modules/@cctest/scheduler/logs/PR-TEST/nowJobId.log' + scheduler cicd -p PR-TEST -v ${{ steps.parse_pr.outputs.pr_base_ref }} -g PR-TEST -r cctest.cocos.org + JOBID=`cat /usr/local/lib/node_modules/@cctest/scheduler/logs/PR-TEST/nowJobId.log` cd .. - python3 -u ./python/main.py -target=job_result --jobid=$JOBID - + python3 -u ./python/main.py --target=job_editor --jobid=$JOBID - name: Update Comment uses: peter-evans/create-or-update-comment@v1 with: @@ -256,8 +287,8 @@ jobs: @${{ steps.parse_pr.outputs.pr_author }}, Please check the result of `run test cases`: - Test Platform: PR-Test - Editor Version: ${{ steps.run_test_cases.outputs.editor }} - # - Task Result: ${{ steps.run_test_cases.outputs.task }} - # - Task URL: ${{ steps.run_test_cases.outputs.url }} + - Task Result: ${{ steps.run_test_cases.outputs.status }} + - Task URL: http://cctest.cocos.org/#/reportview/PR-TEST/${{ steps.run_test_cases.outputs.jobid }}/-1 - GitHub Action: https://github.com/cocos/cocos-engine/actions/runs/${{ github.run_id }} ## Task Details ${{ steps.run_test_cases.outputs.report }} diff --git a/EngineErrorMap.md b/EngineErrorMap.md index 46162067f52..2900e3e321e 100644 --- a/EngineErrorMap.md +++ b/EngineErrorMap.md @@ -1845,6 +1845,22 @@ Previous error occurred when instantiating animation clip %s on node %s. '%s' is not found from '%s'. It's specified as the root node to play animation clip '%s'. +### 3940 + +Error when animation attempted to bind material uniform target: target %s is not a material. + +### 3941 + +Error when animation attempted to bind material uniform target: material %s has no recorded pass %s. + +### 3942 + +Error when animation attempted to bind material uniform target: material %s at pass %s has no recorded uniform %s. + +### 3943 + +Error when animation attempted to bind material uniform target: material %s at pass %s's uniform %s has no recorded channel %s. + ### 4000 diff --git a/cocos/animation/tracks/track.ts b/cocos/animation/tracks/track.ts index 720ea552c83..65885f45f59 100644 --- a/cocos/animation/tracks/track.ts +++ b/cocos/animation/tracks/track.ts @@ -389,6 +389,9 @@ export class TrackBinding { return null; } const runtimeProxy = proxy.forTarget(resultTarget); + if (!runtimeProxy) { + return null; + } const binding: RuntimeBinding = { setValue: (value) => { runtimeProxy.set(value); diff --git a/cocos/animation/value-proxy-factories/uniform.ts b/cocos/animation/value-proxy-factories/uniform.ts index 4a3b8c039fb..50c366d9cbe 100644 --- a/cocos/animation/value-proxy-factories/uniform.ts +++ b/cocos/animation/value-proxy-factories/uniform.ts @@ -31,7 +31,7 @@ import { deviceManager, Type } from '../../gfx'; import { Pass } from '../../render-scene/core/pass'; import { getDefaultFromType, getStringFromType } from '../../render-scene/core/pass-utils'; import { IValueProxy, IValueProxyFactory } from '../value-proxy'; -import { warn } from '../../core'; +import { warn, warnID } from '../../core'; /** * @en @@ -73,19 +73,38 @@ export class UniformProxyFactory implements IValueProxyFactory { this.uniformName = uniformName || ''; } - public forTarget (target: Material): IValueProxy { - const pass = target.passes[this.passIndex]; - const handle = pass.getHandle(this.uniformName); + public forTarget (target: unknown): IValueProxy | undefined { + if (!(target instanceof Material)) { + warnID(3940, target); + return undefined; + } + + const { + passIndex, + uniformName, + channelIndex, + } = this; + + if (passIndex < 0 || passIndex >= target.passes.length) { + warnID(3941, target.name, passIndex); + return undefined; + } + + const pass = target.passes[passIndex]; + const handle = pass.getHandle(uniformName); if (!handle) { - throw new Error(`Material "${target.name}" has no uniform "${this.uniformName}"`); + warnID(3942, target.name, passIndex, uniformName); + return undefined; } + const type = Pass.getTypeFromHandle(handle); if (type < Type.SAMPLER1D) { - const realHandle = this.channelIndex === undefined ? handle : pass.getHandle(this.uniformName, this.channelIndex, Type.FLOAT); + const realHandle = channelIndex === undefined ? handle : pass.getHandle(uniformName, channelIndex, Type.FLOAT); if (!realHandle) { - throw new Error(`Uniform "${this.uniformName} (in material ${target.name}) has no channel ${this.channelIndex!}"`); + warnID(3943, target.name, passIndex, uniformName, channelIndex); + return undefined; } - if (isUniformArray(pass, this.uniformName)) { + if (isUniformArray(pass, uniformName)) { return { set: (value: any) => { pass.setUniformArray(realHandle, value); @@ -99,7 +118,7 @@ export class UniformProxyFactory implements IValueProxyFactory { }; } else { const binding = Pass.getBindingFromHandle(handle); - const prop = pass.properties[this.uniformName]; + const prop = pass.properties[uniformName]; const texName = prop && prop.value ? `${prop.value as string}${getStringFromType(prop.type)}` : getDefaultFromType(prop.type) as string; let dftTex = builtinResMgr.get(texName); if (!dftTex) { diff --git a/cocos/animation/value-proxy.ts b/cocos/animation/value-proxy.ts index 3bab33889a6..f011a89a0d7 100644 --- a/cocos/animation/value-proxy.ts +++ b/cocos/animation/value-proxy.ts @@ -56,6 +56,8 @@ export interface IValueProxyFactory { * @zh * 返回指定目标的曲线值代理。 * @param target The target acquiring the value proxy. + * @returns The value proxy, or undefined if the proxy could not be created. + * In later case, a warn should be given before returning. */ - forTarget (target: any): IValueProxy; + forTarget (target: any): IValueProxy | undefined; } diff --git a/cocos/asset/assets/material.ts b/cocos/asset/assets/material.ts index ef14680e7ac..dcb90c9c52f 100644 --- a/cocos/asset/assets/material.ts +++ b/cocos/asset/assets/material.ts @@ -348,7 +348,7 @@ export class Material extends Asset { if (name in props) { return props[name]; } } } else { - if (passIdx >= this._props.length) { console.warn(`illegal pass index: ${passIdx}.`); return null; } + if (passIdx >= this._passes.length) { console.warn(`illegal pass index: ${passIdx}.`); return null; } const props = this._props[this._passes[passIdx].propertyIndex]; if (name in props) { return props[name]; } } diff --git a/cocos/gfx/base/define.ts b/cocos/gfx/base/define.ts index d756533edf7..2a0296c8bed 100644 --- a/cocos/gfx/base/define.ts +++ b/cocos/gfx/base/define.ts @@ -1581,24 +1581,16 @@ export class SubpassDependency { public srcSubpass: number = 0, public dstSubpass: number = 0, public generalBarrier: GeneralBarrier = null!, - public bufferBarriers: BufferBarrier = null!, - public buffers: Buffer = null!, - public bufferBarrierCount: number = 0, - public textureBarriers: TextureBarrier = null!, - public textures: Texture = null!, - public textureBarrierCount: number = 0, + public prevAccesses: AccessFlags[] = [AccessFlagBit.NONE], + public nextAccesses: AccessFlags[] = [AccessFlagBit.NONE], ) {} public copy (info: Readonly) { this.srcSubpass = info.srcSubpass; this.dstSubpass = info.dstSubpass; this.generalBarrier = info.generalBarrier; - this.bufferBarriers = info.bufferBarriers; - this.buffers = info.buffers; - this.bufferBarrierCount = info.bufferBarrierCount; - this.textureBarriers = info.textureBarriers; - this.textures = info.textures; - this.textureBarrierCount = info.textureBarrierCount; + this.prevAccesses = info.prevAccesses.slice(); + this.nextAccesses = info.nextAccesses.slice(); return this; } } diff --git a/cocos/gfx/webgl/webgl-commands.ts b/cocos/gfx/webgl/webgl-commands.ts index 54fbe5943e2..cce7ad96318 100644 --- a/cocos/gfx/webgl/webgl-commands.ts +++ b/cocos/gfx/webgl/webgl-commands.ts @@ -2101,7 +2101,7 @@ export function WebGLCmdFuncBindStates ( } if (!vf32) { - error(`Buffer binding '${glBlock.name}' at set ${glBlock.set} binding ${glBlock.binding} is not bounded`); + // error(`Buffer binding '${glBlock.name}' at set ${glBlock.set} binding ${glBlock.binding} is not bounded`); continue; } @@ -2274,7 +2274,7 @@ export function WebGLCmdFuncBindStates ( const texUnit = glSampler.units[l]; if (!gpuDescriptor || !gpuDescriptor.gpuSampler) { - error(`Sampler binding '${glSampler.name}' at set ${glSampler.set} binding ${glSampler.binding} index ${l} is not bounded`); + // error(`Sampler binding '${glSampler.name}' at set ${glSampler.set} binding ${glSampler.binding} index ${l} is not bounded`); continue; } diff --git a/cocos/gfx/webgl2/webgl2-commands.ts b/cocos/gfx/webgl2/webgl2-commands.ts index 26657fc6b4d..946207b2ae5 100644 --- a/cocos/gfx/webgl2/webgl2-commands.ts +++ b/cocos/gfx/webgl2/webgl2-commands.ts @@ -2360,7 +2360,7 @@ export function WebGL2CmdFuncBindStates ( const gpuDescriptor = descriptorIndex >= 0 && gpuDescriptorSet.gpuDescriptors[descriptorIndex]; if (!gpuDescriptor || !gpuDescriptor.gpuBuffer) { - error(`Buffer binding '${glBlock.name}' at set ${glBlock.set} binding ${glBlock.binding} is not bounded`); + // error(`Buffer binding '${glBlock.name}' at set ${glBlock.set} binding ${glBlock.binding} is not bounded`); continue; } @@ -2395,7 +2395,7 @@ export function WebGL2CmdFuncBindStates ( const glTexUnit = cache.glTexUnits[texUnit]; if (!gpuDescriptor || !gpuDescriptor.gpuTextureView || !gpuDescriptor.gpuTextureView.gpuTexture || !gpuDescriptor.gpuSampler) { - error(`Sampler binding '${glSampler.name}' at set ${glSampler.set} binding ${glSampler.binding} index ${l} is not bounded`); + // error(`Sampler binding '${glSampler.name}' at set ${glSampler.set} binding ${glSampler.binding} index ${l} is not bounded`); continue; } diff --git a/cocos/rendering/custom/builtin-pipelines.ts b/cocos/rendering/custom/builtin-pipelines.ts index b2d12a1ae80..883ef1a3380 100644 --- a/cocos/rendering/custom/builtin-pipelines.ts +++ b/cocos/rendering/custom/builtin-pipelines.ts @@ -24,13 +24,13 @@ import { EDITOR } from 'internal:constants'; import { Camera, CameraUsage } from '../../render-scene/scene'; -import { Pipeline, PipelineBuilder } from './pipeline'; +import { BasicPipeline, PipelineBuilder } from './pipeline'; import { buildForwardPass, buildGBufferPass, buildLightingPass, buildPostprocessPass, buildReflectionProbePasss, buildUIPass } from './define'; import { isUICamera } from './utils'; export class ForwardPipelineBuilder implements PipelineBuilder { - public setup (cameras: Camera[], ppl: Pipeline): void { + public setup (cameras: Camera[], ppl: BasicPipeline): void { for (let i = 0; i < cameras.length; i++) { const camera = cameras[i]; if (camera.scene === null) { @@ -46,7 +46,7 @@ export class ForwardPipelineBuilder implements PipelineBuilder { } export class DeferredPipelineBuilder implements PipelineBuilder { - public setup (cameras: Camera[], ppl: Pipeline): void { + public setup (cameras: Camera[], ppl: BasicPipeline): void { for (let i = 0; i < cameras.length; ++i) { const camera = cameras[i]; if (!camera.scene) { diff --git a/cocos/rendering/custom/compiler.ts b/cocos/rendering/custom/compiler.ts index 9f709617006..14cc58e5212 100644 --- a/cocos/rendering/custom/compiler.ts +++ b/cocos/rendering/custom/compiler.ts @@ -27,7 +27,7 @@ import { assert, warn } from '../../core'; import { VectorGraphColorMap } from './effect'; import { DefaultVisitor, depthFirstSearch, ReferenceGraphView } from './graph'; import { LayoutGraphData } from './layout-graph'; -import { Pipeline } from './pipeline'; +import { BasicPipeline } from './pipeline'; import { Blit, ClearView, ComputePass, ComputeSubpass, CopyPass, Dispatch, ManagedBuffer, ManagedResource, ManagedTexture, MovePass, RasterPass, RasterSubpass, RaytracePass, RenderGraph, RenderGraphVisitor, RenderQueue, RenderSwapchain, ResourceGraph, ResourceGraphObject, ResourceGraphVisitor, ResourceTraits, SceneData } from './render-graph'; @@ -287,7 +287,7 @@ class ResourceUseContext { computes: Map = new Map(); } class CompilerContext { - set (pipeline: Pipeline, + set (pipeline: BasicPipeline, resGraph: ResourceGraph, renderGraph: RenderGraph, layoutGraph: LayoutGraphData) { @@ -309,9 +309,9 @@ class CompilerContext { export class Compiler { private _resourceGraph: ResourceGraph; - private _pipeline: Pipeline; + private _pipeline: BasicPipeline; private _layoutGraph: LayoutGraphData; - constructor (pipeline: Pipeline, + constructor (pipeline: BasicPipeline, resGraph: ResourceGraph, layoutGraph: LayoutGraphData) { this._pipeline = pipeline; @@ -328,6 +328,9 @@ export class Compiler { const resId = this._resourceGraph.vertex(name); const trait = this._resourceGraph.getTraits(resId); const rasterArr: number[] = Array.from(use.rasters.keys()); + if (!rasterArr.length) { + continue; + } const min = rasterArr.reduce((prev, current) => (prev < current ? prev : current)); const firstRaster = use.rasters.get(min)!; diff --git a/cocos/rendering/custom/custom-pipeline.ts b/cocos/rendering/custom/custom-pipeline.ts index 66605e74fea..000f09e3a9f 100644 --- a/cocos/rendering/custom/custom-pipeline.ts +++ b/cocos/rendering/custom/custom-pipeline.ts @@ -22,15 +22,18 @@ THE SOFTWARE. */ +import { Format, LoadOp } from '../../gfx/base/define'; import { Camera, CameraUsage } from '../../render-scene/scene'; import { buildFxaaPass, buildBloomPass as buildBloomPasses, buildForwardPass, - buildNativeDeferredPipeline, buildNativeForwardPass, buildPostprocessPass, + buildPostprocessPass, AntiAliasing, buildUIPass } from './define'; -import { Pipeline, PipelineBuilder } from './pipeline'; +import { BasicPipeline, PipelineBuilder } from './pipeline'; +import { LightInfo, QueueHint, SceneFlags } from './types'; import { isUICamera } from './utils'; +import { RenderWindow } from '../../render-scene/core/render-window'; export class CustomPipelineBuilder implements PipelineBuilder { - public setup (cameras: Camera[], ppl: Pipeline): void { + public setup (cameras: Camera[], ppl: BasicPipeline): void { for (let i = 0; i < cameras.length; i++) { const camera = cameras[i]; if (camera.scene === null) { @@ -61,8 +64,21 @@ export class CustomPipelineBuilder implements PipelineBuilder { } } -export class NativePipelineBuilder implements PipelineBuilder { - public setup (cameras: Camera[], ppl: Pipeline): void { +class CameraInfo { + constructor (id: number, windowID: number, width: number, height: number) { + this.id = id; + this.windowID = windowID; + this.width = width; + this.height = height; + } + id = 0xFFFFFFFF; + windowID = 0xFFFFFFFF; + width = 0; + height = 0; +} + +export class TestPipelineBuilder implements PipelineBuilder { + public setup (cameras: Camera[], ppl: BasicPipeline): void { for (let i = 0; i < cameras.length; i++) { const camera = cameras[i]; if (camera.scene === null) { @@ -72,8 +88,73 @@ export class NativePipelineBuilder implements PipelineBuilder { buildForwardPass(camera, ppl, false); continue; } - buildNativeForwardPass(camera, ppl); - // buildNativeDeferredPipeline(camera, ppl); + const info = this.prepareGameCamera(ppl, camera); + this.buildForward(ppl, camera, info.id, info.width, info.height); + } + } + private prepareRenderWindow (camera: Camera): number { + let windowID = this._windows.get(camera.window); + if (windowID === undefined) { + windowID = this._windows.size; + this._windows.set(camera.window, windowID); + } + return windowID; + } + private prepareGameCamera (ppl: BasicPipeline, camera: Camera): CameraInfo { + let info = this._cameras.get(camera); + if (info !== undefined) { + let width = camera.window.width; + let height = camera.window.height; + if (width === 0) { + width = 1; + } + if (height === 0) { + height = 1; + } + const windowID = this.prepareRenderWindow(camera); + if (info.width === width && info.height === height && info.windowID === windowID) { + return info; + } + this.updateGameCamera(ppl, camera, info.id, info.windowID, info.width, info.height); + return info; + } + const windowID = this.prepareRenderWindow(camera); + info = new CameraInfo( + this._cameras.size, + windowID, + camera.window.width ? camera.window.width : 1, + camera.window.height ? camera.window.height : 1, + ); + this.initGameCamera(ppl, camera, info.id, info.windowID, info.width, info.height); + this._cameras.set(camera, info); + return info; + } + private initGameCamera (ppl: BasicPipeline, camera: Camera, id: number, windowID: number, width: number, height: number) { + ppl.addRenderWindow(`Color${windowID}`, Format.BGRA8, width, height, camera.window); + ppl.addDepthStencil(`DepthStencil${id}`, Format.DEPTH_STENCIL, width, height); + } + private updateGameCamera (ppl: BasicPipeline, camera: Camera, id: number, windowID: number, width: number, height: number) { + ppl.updateRenderWindow(`Color${windowID}`, camera.window); + ppl.updateDepthStencil(`DepthStencil${id}`, width, height); + } + private buildForward (ppl: BasicPipeline, camera: Camera, id: number, width: number, height: number) { + const scene = camera.scene; + const pass = ppl.addRasterPass(width, height, 'default'); + + pass.addRenderTarget(`Color${id}`, 'color', LoadOp.CLEAR); + pass.addDepthStencil(`DepthStencil${id}`, '_', LoadOp.CLEAR); + + if (scene) { + pass.addQueue(QueueHint.RENDER_OPAQUE, 'default') + .addSceneOfCamera(camera, new LightInfo(), SceneFlags.OPAQUE_OBJECT | SceneFlags.DEFAULT_LIGHTING); + + pass.addQueue(QueueHint.RENDER_CUTOUT, 'default') + .addSceneOfCamera(camera, new LightInfo(), SceneFlags.CUTOUT_OBJECT | SceneFlags.DEFAULT_LIGHTING); + + pass.addQueue(QueueHint.RENDER_TRANSPARENT, 'default') + .addSceneOfCamera(camera, new LightInfo(), SceneFlags.TRANSPARENT_OBJECT | SceneFlags.DEFAULT_LIGHTING); } } + readonly _cameras = new Map(); + readonly _windows = new Map(); } diff --git a/cocos/rendering/custom/define.ts b/cocos/rendering/custom/define.ts index 51db6c76b91..ce6f8b9a246 100644 --- a/cocos/rendering/custom/define.ts +++ b/cocos/rendering/custom/define.ts @@ -27,7 +27,7 @@ import { BufferInfo, Buffer, BufferUsageBit, ClearFlagBit, Color, DescriptorSet, Format, Rect, Sampler, StoreOp, Texture, Viewport, MemoryUsageBit } from '../../gfx'; import { Camera, CSMLevel, DirectionalLight, Light, LightType, ReflectionProbe, ShadowType, SKYBOX_FLAG, SpotLight } from '../../render-scene/scene'; import { supportsR32FloatTexture } from '../define'; -import { Pipeline } from './pipeline'; +import { BasicPipeline } from './pipeline'; import { AccessType, AttachmentType, ComputeView, LightInfo, QueueHint, RasterView, ResourceResidency, SceneFlags, UpdateFrequency } from './types'; import { Vec4, macro, geometry, toRadian, cclegacy, assert } from '../../core'; import { Material } from '../../asset/assets'; @@ -45,7 +45,7 @@ export enum AntiAliasing { FXAAHQ, } -export function validPunctualLightsCulling (pipeline: Pipeline, camera: Camera) { +export function validPunctualLightsCulling (pipeline: BasicPipeline, camera: Camera) { const sceneData = pipeline.pipelineSceneData; const validPunctualLights = sceneData.validPunctualLights; validPunctualLights.length = 0; @@ -174,7 +174,7 @@ class FxaaData { let fxaaData: FxaaData | null = null; export function buildFxaaPass (camera: Camera, - ppl: Pipeline, + ppl: BasicPipeline, inputRT: string) { if (!fxaaData) { fxaaData = new FxaaData(); @@ -272,7 +272,7 @@ class BloomData { } let bloomData: BloomData | null = null; export function buildBloomPass (camera: Camera, - ppl: Pipeline, + ppl: BasicPipeline, inputRT: string, threshold = 0.1, iterations = 2, @@ -433,7 +433,7 @@ class PostInfo { let postInfo: PostInfo | null = null; export function buildPostprocessPass (camera: Camera, - ppl: Pipeline, + ppl: BasicPipeline, inputTex: string, antiAliasing: AntiAliasing = AntiAliasing.NONE) { if (!postInfo || (postInfo && postInfo.antiAliasing !== antiAliasing)) { @@ -478,7 +478,7 @@ export function buildPostprocessPass (camera: Camera, } export function buildForwardPass (camera: Camera, - ppl: Pipeline, + ppl: BasicPipeline, isOffScreen: boolean) { if (EDITOR) { ppl.setMacroInt('CC_PIPELINE_TYPE', 0); @@ -547,8 +547,9 @@ export function buildForwardPass (camera: Camera, return { rtName: forwardPassRTName, dsName: forwardPassDSName }; } +let shadowPass; export function buildShadowPass (passName: Readonly, - ppl: Pipeline, + ppl: BasicPipeline, camera: Camera, light: Light, level: number, width: Readonly, height: Readonly) { const fboW = width; @@ -565,19 +566,22 @@ export function buildShadowPass (passName: Readonly, } ppl.updateRenderTarget(shadowMapName, fboW, fboH); ppl.updateDepthStencil(`${shadowMapName}Depth`, fboW, fboH); - const pass = ppl.addRasterPass(width, height, 'default'); - pass.name = passName; - pass.setViewport(new Viewport(area.x, area.y, area.width, area.height)); - pass.addRenderTarget(shadowMapName, '_', LoadOp.CLEAR, StoreOp.STORE, new Color(1, 1, 1, camera.clearColor.w)); - pass.addDepthStencil(`${shadowMapName}Depth`, '_', LoadOp.CLEAR, StoreOp.DISCARD, - camera.clearDepth, camera.clearStencil, ClearFlagBit.DEPTH_STENCIL); - const queue = pass.addQueue(QueueHint.RENDER_OPAQUE); + if (!level) { + shadowPass = ppl.addRasterPass(width, height, 'default'); + shadowPass.name = passName; + shadowPass.setViewport(new Viewport(0, 0, fboW, fboH)); + shadowPass.addRenderTarget(shadowMapName, '_', LoadOp.CLEAR, StoreOp.STORE, new Color(1, 1, 1, camera.clearColor.w)); + shadowPass.addDepthStencil(`${shadowMapName}Depth`, '_', LoadOp.CLEAR, StoreOp.DISCARD, + camera.clearDepth, camera.clearStencil, ClearFlagBit.DEPTH_STENCIL); + } + const queue = shadowPass.addQueue(QueueHint.RENDER_OPAQUE); queue.addSceneOfCamera(camera, new LightInfo(light, level), SceneFlags.SHADOW_CASTER); + queue.setViewport(new Viewport(area.x, area.y, area.width, area.height)); } export function buildReflectionProbePasss (camera: Camera, - ppl: Pipeline, + ppl: BasicPipeline, isOffScreen: boolean) { const probes = cclegacy.internal.reflectionProbeManager.getProbes(); if (probes.length === 0) { @@ -595,7 +599,7 @@ export function buildReflectionProbePasss (camera: Camera, } export function buildReflectionProbePass (camera: Camera, - ppl: Pipeline, probe: ReflectionProbe, renderWindow: RenderWindow, faceIdx: number) { + ppl: BasicPipeline, probe: ReflectionProbe, renderWindow: RenderWindow, faceIdx: number) { const cameraName = `Camera${faceIdx}`; const area = probe.renderArea(); const width = area.x; @@ -632,7 +636,7 @@ class CameraInfo { spotLightShadowNames = new Array(); } -export function buildShadowPasses (cameraName: string, camera: Camera, ppl: Pipeline): CameraInfo { +export function buildShadowPasses (cameraName: string, camera: Camera, ppl: BasicPipeline): CameraInfo { validPunctualLightsCulling(ppl, camera); const pipeline = ppl; const shadowInfo = pipeline.pipelineSceneData.shadows; @@ -693,7 +697,7 @@ export class GBufferInfo { } // deferred passes export function buildGBufferPass (camera: Camera, - ppl: Pipeline) { + ppl: BasicPipeline) { const cameraID = getCameraUniqueID(camera); const area = getRenderArea(camera, camera.window.width, camera.window.height); const width = area.width; @@ -763,7 +767,7 @@ class LightingInfo { let lightingInfo: LightingInfo | null = null; // deferred lighting pass -export function buildLightingPass (camera: Camera, ppl: Pipeline, gBuffer: GBufferInfo) { +export function buildLightingPass (camera: Camera, ppl: BasicPipeline, gBuffer: GBufferInfo) { if (!lightingInfo) { lightingInfo = new LightingInfo(); } @@ -842,7 +846,7 @@ function getClearFlags (attachment: AttachmentType, clearFlag: ClearFlagBit, loa } export function buildUIPass (camera: Camera, - ppl: Pipeline) { + ppl: BasicPipeline) { const cameraID = getCameraUniqueID(camera); const cameraName = `Camera${cameraID}`; const area = getRenderArea(camera, camera.window.width, camera.window.height); @@ -877,7 +881,7 @@ export function buildUIPass (camera: Camera, } } -export function buildNativeForwardPass (camera: Camera, ppl: Pipeline) { +export function buildNativeForwardPass (camera: Camera, ppl: BasicPipeline) { const cameraID = getCameraUniqueID(camera); const cameraName = `Camera${cameraID}`; const area = getRenderArea(camera, camera.window.width, camera.window.height); @@ -937,7 +941,7 @@ export function buildNativeForwardPass (camera: Camera, ppl: Pipeline) { forwardPass.showStatistics = true; } -export function buildNativeDeferredPipeline (camera: Camera, ppl: Pipeline) { +export function buildNativeDeferredPipeline (camera: Camera, ppl: BasicPipeline) { const cameraID = getCameraUniqueID(camera); const area = getRenderArea(camera, camera.window.width, camera.window.height); const width = area.width; @@ -1012,7 +1016,7 @@ export function buildNativeDeferredPipeline (camera: Camera, ppl: Pipeline) { } } -export function updateCameraUBO (setter: any, camera: Readonly, ppl: Readonly) { +export function updateCameraUBO (setter: any, camera: Readonly, ppl: Readonly) { const pipeline = cclegacy.director.root.pipeline; const sceneData = ppl.pipelineSceneData; const skybox = sceneData.skybox; diff --git a/cocos/rendering/custom/executor.ts b/cocos/rendering/custom/executor.ts index c00ee406ffb..d3486629790 100644 --- a/cocos/rendering/custom/executor.ts +++ b/cocos/rendering/custom/executor.ts @@ -47,7 +47,7 @@ import { IRenderPass, isEnableEffect, SetIndex, UBODeferredLight, UBOForwardLigh import { PipelineSceneData } from '../pipeline-scene-data'; import { PipelineInputAssemblerData } from '../render-pipeline'; import { DescriptorSetData, LayoutGraphData, PipelineLayoutData, RenderPhaseData, RenderStageData } from './layout-graph'; -import { Pipeline, SceneVisitor } from './pipeline'; +import { BasicPipeline, SceneVisitor } from './pipeline'; import { Blit, ClearView, ComputePass, ComputeSubpass, CopyPass, Dispatch, ManagedBuffer, ManagedResource, ManagedTexture, MovePass, RasterPass, RasterSubpass, RaytracePass, RenderData, RenderGraph, RenderGraphVisitor, RenderQueue, RenderSwapchain, ResourceDesc, ResourceGraph, ResourceGraphVisitor, ResourceTraits, SceneData } from './render-graph'; @@ -462,7 +462,8 @@ class SubmitInfo { public opaqueList: RenderInfo[] = []; public transparentList: RenderInfo[] = []; public planarQueue: PlanarShadowQueue | null = null; - public shadowMap: RenderShadowMapBatchedQueue | null = null; + // + public shadowMap: Map = new Map(); public additiveLight: RenderAdditiveLightQueue | null = null; public reflectionProbe: RenderReflectionProbeQueue | null = null; reset () { @@ -472,7 +473,7 @@ class SubmitInfo { this.opaqueList.length = 0; this.transparentList.length = 0; this.planarQueue = null; - this.shadowMap = null; + this.shadowMap.clear(); this.additiveLight = null; this.reflectionProbe = null; } @@ -571,7 +572,10 @@ class RasterPassInfo { computeView.name = currComputeView.name; computeView.accessType = currComputeView.accessType; computeView.clearFlags = currComputeView.clearFlags; - computeView.clearColor.copy(currComputeView.clearColor); + computeView.clearValue.x = currComputeView.clearValue.x; + computeView.clearValue.y = currComputeView.clearValue.y; + computeView.clearValue.z = currComputeView.clearValue.z; + computeView.clearValue.w = currComputeView.clearValue.w; computeView.clearValueType = currComputeView.clearValueType; computeViews[idx] = computeView; idx++; @@ -1010,12 +1014,15 @@ class DevicePreSceneTask extends WebSceneTask { // shadowmap if (isShadowMap(this.graphScene)) { - assert(this.graphScene.scene!.light.light); - if (!this._submitInfo.shadowMap) { - this._submitInfo.shadowMap = context.shadowMapBatched; + const scene = this.graphScene.scene!; + assert(scene.light.light); + let shadowQueue = this._submitInfo.shadowMap.get(this.graphScene.sceneID); + if (!shadowQueue) { + shadowQueue = new RenderShadowMapBatchedQueue(context.pipeline); + this._submitInfo.shadowMap.set(this.graphScene.sceneID, shadowQueue); } - this.sceneData.shadowFrameBufferMap.set(this.graphScene.scene!.light.light, devicePass.framebuffer); - this._submitInfo.shadowMap.gatherLightPasses(this.camera, this.graphScene.scene!.light.light, this._cmdBuff, this.graphScene.scene!.light.level); + this.sceneData.shadowFrameBufferMap.set(scene.light.light, devicePass.framebuffer); + shadowQueue.gatherLightPasses(this.camera, scene.light.light, this._cmdBuff, scene.light.level); return; } // reflection probe @@ -1166,49 +1173,7 @@ class DevicePreSceneTask extends WebSceneTask { if (!isEnableEffect()) context.pipeline.descriptorSet.update(); } - protected _setMainLightShadowTex (data: RenderData) { - const graphScene = this.graphScene; - if (graphScene.scene && graphScene.scene.camera) { - const mainLight = graphScene.scene.camera.scene!.mainLight; - const shadowFrameBufferMap = this.sceneData.shadowFrameBufferMap; - if (mainLight && shadowFrameBufferMap.has(mainLight)) { - const shadowAttrID = context.layoutGraph.attributeIndex.get('cc_shadowMap'); - const defaultTex = builtinResMgr.get('default-texture').getGFXTexture()!; - for (const [key, value] of data.textures) { - if (key === shadowAttrID) { - const tex = data.textures.get(shadowAttrID); - if (tex === defaultTex) { - data.textures.set(key, shadowFrameBufferMap.get(mainLight)!.colorTextures[0]!); - } - return; - } - } - } - } - } - - protected _updateUbo () { - if (this._currentQueue.isUpdateUBO) return; - const devicePass = this._currentQueue.devicePass; - const rasterId = devicePass.rasterPassInfo.id; - const passRenderData = context.renderGraph.getData(rasterId); - // CCGlobal - this._updateGlobal(passRenderData); - // CCCamera, CCShadow, CCCSM - const queueId = this._currentQueue.queueId; - const queueRenderData = context.renderGraph.getData(queueId)!; - this._setMainLightShadowTex(queueRenderData); - this._updateGlobal(queueRenderData); - if (isEnableEffect()) { - const layoutName = context.renderGraph.getLayout(rasterId); - const descSetData = getDescriptorSetDataFromLayout(layoutName); - mergeSrcToTargetDesc(descSetData!.descriptorSet, context.pipeline.descriptorSet, true); - } - this._currentQueue.isUpdateUBO = true; - } - public submit () { - this._updateUbo(); if (this.graphScene.blit) { this._currentQueue.blitDesc!.update(); return; @@ -1356,7 +1321,7 @@ class DeviceSceneTask extends WebSceneTask { protected _recordShadowMap () { const submitMap = context.submitMap; const currSubmitInfo = submitMap.get(this.camera!)!.get(this._currentQueue.phaseID)!; - currSubmitInfo.shadowMap?.recordCommandBuffer(context.device, + currSubmitInfo.shadowMap.get(this.graphScene.sceneID)!.recordCommandBuffer(context.device, this._renderPass, context.commandBuffer); } protected _recordReflectionProbe () { @@ -1429,10 +1394,54 @@ class DeviceSceneTask extends WebSceneTask { this._renderPass, context.commandBuffer); } - + protected _updateGlobal (data: RenderData) { + const devicePass = this._currentQueue.devicePass; + updateGlobalDescBinding(data, isEnableEffect() ? context.renderGraph.getLayout(devicePass.rasterPassInfo.id) : 'default'); + if (!isEnableEffect()) context.pipeline.descriptorSet.update(); + } + protected _setMainLightShadowTex (data: RenderData) { + const graphScene = this.graphScene; + if (graphScene.scene && graphScene.scene.camera) { + const mainLight = graphScene.scene.camera.scene!.mainLight; + const shadowFrameBufferMap = this.sceneData.shadowFrameBufferMap; + if (mainLight && shadowFrameBufferMap.has(mainLight)) { + const shadowAttrID = context.layoutGraph.attributeIndex.get('cc_shadowMap'); + const defaultTex = builtinResMgr.get('default-texture').getGFXTexture()!; + for (const [key, value] of data.textures) { + if (key === shadowAttrID) { + const tex = data.textures.get(shadowAttrID); + if (tex === defaultTex) { + data.textures.set(key, shadowFrameBufferMap.get(mainLight)!.colorTextures[0]!); + } + return; + } + } + } + } + } + protected _updateRenderData () { + if (this._currentQueue.isUpdateUBO) return; + const devicePass = this._currentQueue.devicePass; + const rasterId = devicePass.rasterPassInfo.id; + const passRenderData = context.renderGraph.getData(rasterId); + // CCGlobal + this._updateGlobal(passRenderData); + // CCCamera, CCShadow, CCCSM + const queueId = this._currentQueue.queueId; + const queueRenderData = context.renderGraph.getData(queueId)!; + this._setMainLightShadowTex(queueRenderData); + this._updateGlobal(queueRenderData); + if (isEnableEffect()) { + const layoutName = context.renderGraph.getLayout(rasterId); + const descSetData = getDescriptorSetDataFromLayout(layoutName); + mergeSrcToTargetDesc(descSetData!.descriptorSet, context.pipeline.descriptorSet, true); + } + this._currentQueue.isUpdateUBO = true; + } public submit () { const devicePass = this._currentQueue.devicePass; const queueViewport = this._currentQueue.viewport; + this._updateRenderData(); if (queueViewport) { this.visitor.setViewport(queueViewport); this.visitor.setScissor(this._currentQueue.scissor!); @@ -1717,7 +1726,7 @@ class BlitInfo { } class ExecutorContext { - constructor (pipeline: Pipeline, + constructor (pipeline: BasicPipeline, ubo: PipelineUBO, device: Device, resourceGraph: ResourceGraph, @@ -1755,7 +1764,7 @@ class ExecutorContext { this.blit.resize(width, height); } readonly device: Device; - readonly pipeline: Pipeline; + readonly pipeline: BasicPipeline; readonly commandBuffer: CommandBuffer; readonly pipelineSceneData: PipelineSceneData; readonly resourceGraph: ResourceGraph; @@ -1807,7 +1816,7 @@ class ResourceVisitor implements ResourceGraphVisitor { } export class Executor { - constructor (pipeline: Pipeline, + constructor (pipeline: BasicPipeline, ubo: PipelineUBO, device: Device, resourceGraph: ResourceGraph, diff --git a/cocos/rendering/custom/index.jsb.ts b/cocos/rendering/custom/index.jsb.ts index 34364d05474..965646ebb69 100644 --- a/cocos/rendering/custom/index.jsb.ts +++ b/cocos/rendering/custom/index.jsb.ts @@ -26,7 +26,7 @@ declare const render: any; import { Pipeline, PipelineBuilder, RenderingModule } from './pipeline'; import { DeferredPipelineBuilder, ForwardPipelineBuilder } from './builtin-pipelines'; -import { CustomPipelineBuilder, NativePipelineBuilder } from './custom-pipeline'; +import { CustomPipelineBuilder, TestPipelineBuilder } from './custom-pipeline'; import { Device } from '../../gfx'; export * from './types'; @@ -60,7 +60,7 @@ function addCustomBuiltinPipelines (map: Map) { map.set('Forward', new ForwardPipelineBuilder()); map.set('Deferred', new DeferredPipelineBuilder()); map.set('Custom', new CustomPipelineBuilder()); - map.set('Native', new NativePipelineBuilder()); + map.set('Test', new TestPipelineBuilder()); } addCustomBuiltinPipelines(customPipelineBuilderMap); diff --git a/cocos/rendering/custom/index.ts b/cocos/rendering/custom/index.ts index ffea8944989..31790ea401d 100644 --- a/cocos/rendering/custom/index.ts +++ b/cocos/rendering/custom/index.ts @@ -23,11 +23,11 @@ */ import { EDITOR } from 'internal:constants'; -import { Pipeline, PipelineBuilder } from './pipeline'; +import { BasicPipeline, PipelineBuilder } from './pipeline'; import { WebPipeline } from './web-pipeline'; import { macro } from '../../core/platform/macro'; import { DeferredPipelineBuilder, ForwardPipelineBuilder } from './builtin-pipelines'; -import { CustomPipelineBuilder, NativePipelineBuilder } from './custom-pipeline'; +import { CustomPipelineBuilder, TestPipelineBuilder } from './custom-pipeline'; import { LayoutGraphData, loadLayoutGraphData } from './layout-graph'; import { BinaryInputArchive } from './binary-archive'; import { WebProgramLibrary } from './web-program-library'; @@ -47,7 +47,7 @@ export * from './archive'; export const enableEffectImport = true; export const programLib: ProgramLibrary = new WebProgramLibrary(defaultLayoutGraph); -export function createCustomPipeline (): Pipeline { +export function createCustomPipeline (): BasicPipeline { const layoutGraph = defaultLayoutGraph; const ppl = new WebPipeline(layoutGraph); @@ -76,7 +76,7 @@ function addCustomBuiltinPipelines (map: Map) { map.set('Forward', new ForwardPipelineBuilder()); map.set('Deferred', new DeferredPipelineBuilder()); map.set('Custom', new CustomPipelineBuilder()); - map.set('Native', new NativePipelineBuilder()); + map.set('Test', new TestPipelineBuilder()); } addCustomBuiltinPipelines(customPipelineBuilderMap); diff --git a/cocos/rendering/custom/pipeline.ts b/cocos/rendering/custom/pipeline.ts index ced60a4e1d2..cb3f9808ed6 100644 --- a/cocos/rendering/custom/pipeline.ts +++ b/cocos/rendering/custom/pipeline.ts @@ -36,7 +36,7 @@ import { GlobalDSManager } from '../global-descriptor-set-manager'; import { Mat4, Quat, Vec2, Vec4 } from '../../core/math'; import { MacroRecord } from '../../render-scene/core/pass-utils'; import { PipelineSceneData } from '../pipeline-scene-data'; -import { AccessType, ComputeView, CopyPair, LightInfo, MovePair, QueueHint, RasterView, ResourceResidency, SceneFlags, TaskType, UpdateFrequency } from './types'; +import { AccessType, ClearValue, ClearValueType, ComputeView, CopyPair, LightInfo, MovePair, QueueHint, RasterView, ResourceResidency, SceneFlags, TaskType, UpdateFrequency } from './types'; import { RenderScene } from '../../render-scene/core/render-scene'; import { RenderWindow } from '../../render-scene/core/render-window'; import { Model } from '../../render-scene/scene'; @@ -68,7 +68,7 @@ export interface PipelineRuntime { export interface RenderNode { name: string; /** - * @beta method's name might change + * @beta function signature might change */ setCustomBehavior (name: string): void; } @@ -86,13 +86,20 @@ export interface Setter extends RenderNode { setReadWriteBuffer (name: string, buffer: Buffer): void; setReadWriteTexture (name: string, texture: Texture): void; setSampler (name: string, sampler: Sampler): void; + setCamera (camera: Camera): void; } export interface RasterQueueBuilder extends Setter { + /** + * @deprecated method will be removed in 3.8.0 + */ addSceneOfCamera (camera: Camera, light: LightInfo, sceneFlags: SceneFlags): void; + /** + * @deprecated method will be removed in 3.8.0 + */ addSceneOfCamera (camera: Camera, light: LightInfo/*, SceneFlags.NONE*/): void; - addScene (name: string, sceneFlags: SceneFlags): void; - addScene (name: string/*, SceneFlags.NONE*/): void; + addScene (scene: RenderScene, sceneFlags: SceneFlags): void; + addScene (scene: RenderScene/*, SceneFlags.NONE*/): void; addFullscreenQuad (material: Material, passID: number, sceneFlags: SceneFlags): void; addFullscreenQuad (material: Material, passID: number/*, SceneFlags.NONE*/): void; addCameraQuad (camera: Camera, material: Material, passID: number, sceneFlags: SceneFlags): void; @@ -101,64 +108,29 @@ export interface RasterQueueBuilder extends Setter { clearRenderTarget (name: string/*, new Color()*/): void; setViewport (viewport: Viewport): void; /** - * @beta method's name might change + * @beta function signature might change */ addCustomCommand (customBehavior: string): void; } export interface RasterSubpassBuilder extends Setter { - /** - * @beta method's name might change - */ addRenderTarget (name: string, accessType: AccessType, slotName: string, loadOp: LoadOp, storeOp: StoreOp, color: Color): void; - /** - * @beta method's name might change - */ addRenderTarget (name: string, accessType: AccessType, slotName: string, loadOp: LoadOp, storeOp: StoreOp/*, new Color()*/): void; - /** - * @beta method's name might change - */ addRenderTarget (name: string, accessType: AccessType, slotName: string, loadOp: LoadOp/*, StoreOp.STORE, new Color()*/): void; - /** - * @beta method's name might change - */ addRenderTarget (name: string, accessType: AccessType, slotName: string/*, LoadOp.CLEAR, StoreOp.STORE, new Color()*/): void; - /** - * @beta method's name might change - */ addDepthStencil (name: string, accessType: AccessType, slotName: string, loadOp: LoadOp, storeOp: StoreOp, depth: number, stencil: number, clearFlags: ClearFlagBit): void; - /** - * @beta method's name might change - */ addDepthStencil (name: string, accessType: AccessType, slotName: string, loadOp: LoadOp, storeOp: StoreOp, depth: number, stencil: number/*, ClearFlagBit.DEPTH_STENCIL*/): void; - /** - * @beta method's name might change - */ addDepthStencil (name: string, accessType: AccessType, slotName: string, loadOp: LoadOp, storeOp: StoreOp, depth: number/*, 0, ClearFlagBit.DEPTH_STENCIL*/): void; - /** - * @beta method's name might change - */ addDepthStencil (name: string, accessType: AccessType, slotName: string, loadOp: LoadOp, storeOp: StoreOp/*, 1, 0, ClearFlagBit.DEPTH_STENCIL*/): void; - /** - * @beta method's name might change - */ addDepthStencil (name: string, accessType: AccessType, slotName: string, loadOp: LoadOp/*, StoreOp.STORE, 1, 0, ClearFlagBit.DEPTH_STENCIL*/): void; - /** - * @beta method's name might change - */ addDepthStencil (name: string, accessType: AccessType, slotName: string/*, LoadOp.CLEAR, StoreOp.STORE, 1, 0, ClearFlagBit.DEPTH_STENCIL*/): void; - /** - * @beta method's name might change - */ addTexture (name: string, slotName: string): void; - /** - * @beta method's name might change - */ - addStorageBuffer (name: string, accessType: AccessType, slotName: string): void; - /** - * @beta method's name might change - */ - addStorageImage (name: string, accessType: AccessType, slotName: string): void; + addStorageBuffer (name: string, accessType: AccessType, slotName: string, clearType: ClearValueType, clearValue: ClearValue): void; + addStorageBuffer (name: string, accessType: AccessType, slotName: string, clearType: ClearValueType/*, new ClearValue()*/): void; + addStorageBuffer (name: string, accessType: AccessType, slotName: string/*, ClearValueType.NONE, new ClearValue()*/): void; + addStorageImage (name: string, accessType: AccessType, slotName: string, clearType: ClearValueType, clearValue: ClearValue): void; + addStorageImage (name: string, accessType: AccessType, slotName: string, clearType: ClearValueType/*, new ClearValue()*/): void; + addStorageImage (name: string, accessType: AccessType, slotName: string/*, ClearValueType.NONE, new ClearValue()*/): void; /** * @deprecated method will be removed in 3.8.0 */ @@ -169,7 +141,7 @@ export interface RasterSubpassBuilder extends Setter { addQueue (/*QueueHint.NONE, ''*/): RasterQueueBuilder; showStatistics: boolean; /** - * @beta method's name might change + * @beta function signature might change */ setCustomShaderStages (name: string, stageFlags: ShaderStageFlagBit): void; } @@ -181,22 +153,14 @@ export interface ComputeQueueBuilder extends Setter { } export interface ComputeSubpassBuilder extends Setter { - /** - * @beta method's name might change - */ addRenderTarget (name: string, slotName: string): void; - /** - * @beta method's name might change - */ addTexture (name: string, slotName: string): void; - /** - * @beta method's name might change - */ - addStorageBuffer (name: string, accessType: AccessType, slotName: string): void; - /** - * @beta method's name might change - */ - addStorageImage (name: string, accessType: AccessType, slotName: string): void; + addStorageBuffer (name: string, accessType: AccessType, slotName: string, clearType: ClearValueType, clearValue: ClearValue): void; + addStorageBuffer (name: string, accessType: AccessType, slotName: string, clearType: ClearValueType/*, new ClearValue()*/): void; + addStorageBuffer (name: string, accessType: AccessType, slotName: string/*, ClearValueType.NONE, new ClearValue()*/): void; + addStorageImage (name: string, accessType: AccessType, slotName: string, clearType: ClearValueType, clearValue: ClearValue): void; + addStorageImage (name: string, accessType: AccessType, slotName: string, clearType: ClearValueType/*, new ClearValue()*/): void; + addStorageImage (name: string, accessType: AccessType, slotName: string/*, ClearValueType.NONE, new ClearValue()*/): void; /** * @deprecated method will be removed in 3.8.0 */ @@ -204,64 +168,23 @@ export interface ComputeSubpassBuilder extends Setter { addQueue (layoutName: string): ComputeQueueBuilder; addQueue (/*''*/): ComputeQueueBuilder; /** - * @beta method's name might change + * @beta function signature might change */ setCustomShaderStages (name: string, stageFlags: ShaderStageFlagBit): void; } -export interface RasterPassBuilder extends Setter { - /** - * @beta method's name might change - */ +export interface BasicRenderPassBuilder extends Setter { addRenderTarget (name: string, slotName: string, loadOp: LoadOp, storeOp: StoreOp, color: Color): void; - /** - * @beta method's name might change - */ addRenderTarget (name: string, slotName: string, loadOp: LoadOp, storeOp: StoreOp/*, new Color()*/): void; - /** - * @beta method's name might change - */ addRenderTarget (name: string, slotName: string, loadOp: LoadOp/*, StoreOp.STORE, new Color()*/): void; - /** - * @beta method's name might change - */ addRenderTarget (name: string, slotName: string/*, LoadOp.CLEAR, StoreOp.STORE, new Color()*/): void; - /** - * @beta method's name might change - */ addDepthStencil (name: string, slotName: string, loadOp: LoadOp, storeOp: StoreOp, depth: number, stencil: number, clearFlags: ClearFlagBit): void; - /** - * @beta method's name might change - */ addDepthStencil (name: string, slotName: string, loadOp: LoadOp, storeOp: StoreOp, depth: number, stencil: number/*, ClearFlagBit.DEPTH_STENCIL*/): void; - /** - * @beta method's name might change - */ addDepthStencil (name: string, slotName: string, loadOp: LoadOp, storeOp: StoreOp, depth: number/*, 0, ClearFlagBit.DEPTH_STENCIL*/): void; - /** - * @beta method's name might change - */ addDepthStencil (name: string, slotName: string, loadOp: LoadOp, storeOp: StoreOp/*, 1, 0, ClearFlagBit.DEPTH_STENCIL*/): void; - /** - * @beta method's name might change - */ addDepthStencil (name: string, slotName: string, loadOp: LoadOp/*, StoreOp.STORE, 1, 0, ClearFlagBit.DEPTH_STENCIL*/): void; - /** - * @beta method's name might change - */ addDepthStencil (name: string, slotName: string/*, LoadOp.CLEAR, StoreOp.STORE, 1, 0, ClearFlagBit.DEPTH_STENCIL*/): void; - /** - * @beta method's name might change - */ addTexture (name: string, slotName: string): void; - /** - * @beta method's name might change - */ - addStorageBuffer (name: string, accessType: AccessType, slotName: string): void; - /** - * @beta method's name might change - */ - addStorageImage (name: string, accessType: AccessType, slotName: string): void; /** * @deprecated method will be removed in 3.8.0 */ @@ -273,32 +196,36 @@ export interface RasterPassBuilder extends Setter { addQueue (hint: QueueHint, layoutName: string): RasterQueueBuilder; addQueue (hint: QueueHint/*, ''*/): RasterQueueBuilder; addQueue (/*QueueHint.NONE, ''*/): RasterQueueBuilder; + setViewport (viewport: Viewport): void; + setVersion (name: string, version: number): void; + showStatistics: boolean; +} + +export interface RasterPassBuilder extends BasicRenderPassBuilder { + addStorageBuffer (name: string, accessType: AccessType, slotName: string, clearType: ClearValueType, clearValue: ClearValue): void; + addStorageBuffer (name: string, accessType: AccessType, slotName: string, clearType: ClearValueType/*, new ClearValue()*/): void; + addStorageBuffer (name: string, accessType: AccessType, slotName: string/*, ClearValueType.NONE, new ClearValue()*/): void; + addStorageImage (name: string, accessType: AccessType, slotName: string, clearType: ClearValueType, clearValue: ClearValue): void; + addStorageImage (name: string, accessType: AccessType, slotName: string, clearType: ClearValueType/*, new ClearValue()*/): void; + addStorageImage (name: string, accessType: AccessType, slotName: string/*, ClearValueType.NONE, new ClearValue()*/): void; addRasterSubpass (layoutName: string): RasterSubpassBuilder; addRasterSubpass (/*''*/): RasterSubpassBuilder; addComputeSubpass (layoutName: string): ComputeSubpassBuilder; addComputeSubpass (/*''*/): ComputeSubpassBuilder; - setViewport (viewport: Viewport): void; - setVersion (name: string, version: number): void; - showStatistics: boolean; /** - * @beta method's name might change + * @beta function signature might change */ setCustomShaderStages (name: string, stageFlags: ShaderStageFlagBit): void; } export interface ComputePassBuilder extends Setter { - /** - * @beta method's name might change - */ addTexture (name: string, slotName: string): void; - /** - * @beta method's name might change - */ - addStorageBuffer (name: string, accessType: AccessType, slotName: string): void; - /** - * @beta method's name might change - */ - addStorageImage (name: string, accessType: AccessType, slotName: string): void; + addStorageBuffer (name: string, accessType: AccessType, slotName: string, clearType: ClearValueType, clearValue: ClearValue): void; + addStorageBuffer (name: string, accessType: AccessType, slotName: string, clearType: ClearValueType/*, new ClearValue()*/): void; + addStorageBuffer (name: string, accessType: AccessType, slotName: string/*, ClearValueType.NONE, new ClearValue()*/): void; + addStorageImage (name: string, accessType: AccessType, slotName: string, clearType: ClearValueType, clearValue: ClearValue): void; + addStorageImage (name: string, accessType: AccessType, slotName: string, clearType: ClearValueType/*, new ClearValue()*/): void; + addStorageImage (name: string, accessType: AccessType, slotName: string/*, ClearValueType.NONE, new ClearValue()*/): void; /** * @deprecated method will be removed in 3.8.0 */ @@ -306,7 +233,7 @@ export interface ComputePassBuilder extends Setter { addQueue (layoutName: string): ComputeQueueBuilder; addQueue (/*''*/): ComputeQueueBuilder; /** - * @beta method's name might change + * @beta function signature might change */ setCustomShaderStages (name: string, stageFlags: ShaderStageFlagBit): void; } @@ -342,7 +269,24 @@ export interface SceneTransversal { transverse (visitor: SceneVisitor): SceneTask; } -export interface Pipeline extends PipelineRuntime { +export enum PipelineType { + BASIC, + STANDARD, +} + +export function getPipelineTypeName (e: PipelineType): string { + switch (e) { + case PipelineType.BASIC: + return 'BASIC'; + case PipelineType.STANDARD: + return 'STANDARD'; + default: + return ''; + } +} + +export interface BasicPipeline extends PipelineRuntime { + readonly pipelineType: PipelineType; beginSetup (): void; endSetup (): void; containsResource (name: string): boolean; @@ -352,49 +296,50 @@ export interface Pipeline extends PipelineRuntime { addRenderTexture (name: string, format: Format, width: number, height: number, renderWindow: RenderWindow): number; addRenderWindow (name: string, format: Format, width: number, height: number, renderWindow: RenderWindow): number; updateRenderWindow (name: string, renderWindow: RenderWindow): void; - addStorageBuffer (name: string, format: Format, size: number, residency: ResourceResidency): number; - addStorageBuffer (name: string, format: Format, size: number/*, ResourceResidency.MANAGED*/): number; addRenderTarget (name: string, format: Format, width: number, height: number, residency: ResourceResidency): number; addRenderTarget (name: string, format: Format, width: number, height: number/*, ResourceResidency.MANAGED*/): number; addDepthStencil (name: string, format: Format, width: number, height: number, residency: ResourceResidency): number; addDepthStencil (name: string, format: Format, width: number, height: number/*, ResourceResidency.MANAGED*/): number; + updateRenderTarget (name: string, width: number, height: number, format: Format): void; + updateRenderTarget (name: string, width: number, height: number/*, Format.UNKNOWN*/): void; + updateDepthStencil (name: string, width: number, height: number, format: Format): void; + updateDepthStencil (name: string, width: number, height: number/*, Format.UNKNOWN*/): void; + beginFrame (): void; + endFrame (): void; + addRasterPass (width: number, height: number, layoutName: string): BasicRenderPassBuilder; + addRasterPass (width: number, height: number/*, 'default'*/): BasicRenderPassBuilder; + addMovePass (): MovePassBuilder; + addCopyPass (): CopyPassBuilder; + getDescriptorSetLayout (shaderName: string, freq: UpdateFrequency): DescriptorSetLayout | null; +} + +export interface Pipeline extends BasicPipeline { + addStorageBuffer (name: string, format: Format, size: number, residency: ResourceResidency): number; + addStorageBuffer (name: string, format: Format, size: number/*, ResourceResidency.MANAGED*/): number; addStorageTexture (name: string, format: Format, width: number, height: number, residency: ResourceResidency): number; addStorageTexture (name: string, format: Format, width: number, height: number/*, ResourceResidency.MANAGED*/): number; addShadingRateTexture (name: string, width: number, height: number, residency: ResourceResidency): number; addShadingRateTexture (name: string, width: number, height: number/*, ResourceResidency.MANAGED*/): number; - /** - * @beta method's name might change - */ - addCustomBuffer (name: string, info: BufferInfo, type: string): number; - /** - * @beta method's name might change - */ - addCustomTexture (name: string, info: TextureInfo, type: string): number; updateStorageBuffer (name: string, size: number, format: Format): void; updateStorageBuffer (name: string, size: number/*, Format.UNKNOWN*/): void; - updateRenderTarget (name: string, width: number, height: number, format: Format): void; - updateRenderTarget (name: string, width: number, height: number/*, Format.UNKNOWN*/): void; - updateDepthStencil (name: string, width: number, height: number, format: Format): void; - updateDepthStencil (name: string, width: number, height: number/*, Format.UNKNOWN*/): void; updateStorageTexture (name: string, width: number, height: number, format: Format): void; updateStorageTexture (name: string, width: number, height: number/*, Format.UNKNOWN*/): void; updateShadingRateTexture (name: string, width: number, height: number): void; - beginFrame (): void; - endFrame (): void; addRasterPass (width: number, height: number, layoutName: string): RasterPassBuilder; addRasterPass (width: number, height: number/*, 'default'*/): RasterPassBuilder; addComputePass (layoutName: string): ComputePassBuilder; - addMovePass (): MovePassBuilder; - addCopyPass (): CopyPassBuilder; /** - * @deprecated method will be removed in 3.8.0 + * @beta function signature might change */ - createSceneTransversal (camera: Camera, scene: RenderScene): SceneTransversal; - getDescriptorSetLayout (shaderName: string, freq: UpdateFrequency): DescriptorSetLayout | null; + addCustomBuffer (name: string, info: BufferInfo, type: string): number; + /** + * @beta function signature might change + */ + addCustomTexture (name: string, info: TextureInfo, type: string): number; } export interface PipelineBuilder { - setup (cameras: Camera[], pipeline: Pipeline): void; + setup (cameras: Camera[], pipeline: BasicPipeline): void; } export interface RenderingModule { diff --git a/cocos/rendering/custom/render-graph.ts b/cocos/rendering/custom/render-graph.ts index 0a5674e47ea..88a574b54fa 100644 --- a/cocos/rendering/custom/render-graph.ts +++ b/cocos/rendering/custom/render-graph.ts @@ -33,6 +33,7 @@ import { Material } from '../../asset/assets'; import { Camera } from '../../render-scene/scene/camera'; import { AccessFlagBit, Buffer, ClearFlagBit, Color, Format, Framebuffer, RenderPass, SampleCount, Sampler, SamplerInfo, Swapchain, Texture, TextureFlagBit, Viewport } from '../../gfx'; import { ComputeView, CopyPair, LightInfo, MovePair, QueueHint, RasterView, ResourceDimension, ResourceFlags, ResourceResidency, SceneFlags } from './types'; +import { RenderScene } from '../../render-scene/core/render-scene'; export class ResourceDesc { dimension: ResourceDimension = ResourceDimension.BUFFER; @@ -1111,7 +1112,7 @@ export class SceneData { /*pointer*/ camera: Camera | null = null; readonly light: LightInfo; flags: SceneFlags; - readonly scenes: string[] = []; + readonly scenes: RenderScene[] = []; } export class Dispatch { diff --git a/cocos/rendering/custom/types.ts b/cocos/rendering/custom/types.ts index 059fce1076f..9f793fcb8de 100644 --- a/cocos/rendering/custom/types.ts +++ b/cocos/rendering/custom/types.ts @@ -291,12 +291,15 @@ export class RasterView { } export enum ClearValueType { + NONE, FLOAT_TYPE, INT_TYPE, } export function getClearValueTypeName (e: ClearValueType): string { switch (e) { + case ClearValueType.NONE: + return 'NONE'; case ClearValueType.FLOAT_TYPE: return 'FLOAT_TYPE'; case ClearValueType.INT_TYPE: @@ -306,27 +309,40 @@ export function getClearValueTypeName (e: ClearValueType): string { } } +export class ClearValue { + constructor (x = 0, y = 0, z = 0, w = 0) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + x: number; + y: number; + z: number; + w: number; +} + export class ComputeView { constructor ( name = '', accessType: AccessType = AccessType.READ, clearFlags: ClearFlagBit = ClearFlagBit.NONE, - clearColor: Color = new Color(), - clearValueType: ClearValueType = ClearValueType.FLOAT_TYPE, + clearValueType: ClearValueType = ClearValueType.NONE, + clearValue: ClearValue = new ClearValue(), shaderStageFlags: ShaderStageFlagBit = ShaderStageFlagBit.NONE, ) { this.name = name; this.accessType = accessType; this.clearFlags = clearFlags; - this.clearColor = clearColor; this.clearValueType = clearValueType; + this.clearValue = clearValue; this.shaderStageFlags = shaderStageFlags; } name: string; accessType: AccessType; clearFlags: ClearFlagBit; - readonly clearColor: Color; clearValueType: ClearValueType; + readonly clearValue: ClearValue; shaderStageFlags: ShaderStageFlagBit; } @@ -514,12 +530,26 @@ export function loadRasterView (ar: InputArchive, v: RasterView) { v.shaderStageFlags = ar.readNumber(); } +export function saveClearValue (ar: OutputArchive, v: ClearValue) { + ar.writeNumber(v.x); + ar.writeNumber(v.y); + ar.writeNumber(v.z); + ar.writeNumber(v.w); +} + +export function loadClearValue (ar: InputArchive, v: ClearValue) { + v.x = ar.readNumber(); + v.y = ar.readNumber(); + v.z = ar.readNumber(); + v.w = ar.readNumber(); +} + export function saveComputeView (ar: OutputArchive, v: ComputeView) { ar.writeString(v.name); ar.writeNumber(v.accessType); ar.writeNumber(v.clearFlags); - saveColor(ar, v.clearColor); ar.writeNumber(v.clearValueType); + saveClearValue(ar, v.clearValue); ar.writeNumber(v.shaderStageFlags); } @@ -527,8 +557,8 @@ export function loadComputeView (ar: InputArchive, v: ComputeView) { v.name = ar.readString(); v.accessType = ar.readNumber(); v.clearFlags = ar.readNumber(); - loadColor(ar, v.clearColor); v.clearValueType = ar.readNumber(); + loadClearValue(ar, v.clearValue); v.shaderStageFlags = ar.readNumber(); } diff --git a/cocos/rendering/custom/web-pipeline.ts b/cocos/rendering/custom/web-pipeline.ts index b4c658aa897..5460513b4a0 100644 --- a/cocos/rendering/custom/web-pipeline.ts +++ b/cocos/rendering/custom/web-pipeline.ts @@ -29,7 +29,7 @@ import { Color, Buffer, DescriptorSetLayout, Device, Feature, Format, FormatFeat import { Mat4, Quat, toRadian, Vec2, Vec3, Vec4, assert, macro, cclegacy } from '../../core'; import { AccessType, AttachmentType, ComputeView, CopyPair, LightInfo, LightingMode, MovePair, QueueHint, RasterView, ResourceDimension, ResourceFlags, ResourceResidency, SceneFlags, UpdateFrequency } from './types'; import { Blit, ClearView, ComputePass, CopyPass, Dispatch, ManagedBuffer, ManagedResource, MovePass, RasterPass, RasterSubpass, RenderData, RenderGraph, RenderGraphComponent, RenderGraphValue, RenderQueue, RenderSwapchain, ResourceDesc, ResourceGraph, ResourceGraphValue, ResourceStates, ResourceTraits, SceneData, Subpass } from './render-graph'; -import { ComputePassBuilder, ComputeQueueBuilder, ComputeSubpassBuilder, CopyPassBuilder, MovePassBuilder, Pipeline, PipelineBuilder, RasterPassBuilder, RasterQueueBuilder, RasterSubpassBuilder, SceneTransversal } from './pipeline'; +import { ComputePassBuilder, ComputeQueueBuilder, ComputeSubpassBuilder, CopyPassBuilder, MovePassBuilder, BasicPipeline, PipelineBuilder, RasterPassBuilder, RasterQueueBuilder, RasterSubpassBuilder, PipelineType } from './pipeline'; import { PipelineSceneData } from '../pipeline-scene-data'; import { Model, Camera, ShadowType, CSMLevel, DirectionalLight, SpotLight, PCFType, Shadows } from '../../render-scene/scene'; import { Light, LightType } from '../../render-scene/scene/light'; @@ -243,6 +243,8 @@ export class WebSetter { const num = this._lg.attributeIndex.get(name)!; this._data.samplers.set(num, sampler); } + public setCamera (camera: Camera): void { + } public hasSampler (name: string): boolean { const id = this._lg.attributeIndex.get(name); if (id === undefined) { @@ -808,10 +810,11 @@ export class WebRasterQueueBuilder extends WebSetter implements RasterQueueBuild setTextureUBOView(this, camera, this._pipeline); initGlobalDescBinding(this._data, layoutName); } - addScene (sceneName: string, sceneFlags = SceneFlags.NONE): void { - const sceneData = new SceneData(sceneName, sceneFlags); + addScene (scene: RenderScene, sceneFlags = SceneFlags.NONE): void { + const sceneData = new SceneData('Scene', sceneFlags); + sceneData.scenes.push(scene); this._renderGraph.addVertex( - RenderGraphValue.Scene, sceneData, sceneName, '', new RenderData(), false, this._vertID, + RenderGraphValue.Scene, sceneData, 'Scene', '', new RenderData(), false, this._vertID, ); } addFullscreenQuad (material: Material, passID: number, sceneFlags = SceneFlags.NONE, name = 'Quad'): void { @@ -1268,10 +1271,13 @@ function isManaged (residency: ResourceResidency): boolean { || residency === ResourceResidency.MEMORYLESS; } -export class WebPipeline implements Pipeline { +export class WebPipeline implements BasicPipeline { constructor (layoutGraph: LayoutGraphData) { this._layoutGraph = layoutGraph; } + get pipelineType () { + return PipelineType.BASIC; + } addCustomBuffer (name: string, info: BufferInfo, type: string): number { throw new Error('Method not implemented.'); } @@ -1369,9 +1375,6 @@ export class WebPipeline implements Pipeline { public addCopyPass (): CopyPassBuilder { throw new Error('Method not implemented.'); } - public createSceneTransversal (camera: Camera, scene: RenderScene): SceneTransversal { - throw new Error('Method not implemented.'); - } protected _generateConstantMacros (clusterEnabled: boolean) { let str = ''; str += `#define CC_DEVICE_SUPPORT_FLOAT_TEXTURE ${this._device.getFormatFeatures(Format.RGBA32F) @@ -1421,7 +1424,8 @@ export class WebPipeline implements Pipeline { this._globalDSManager = new GlobalDSManager(this._device); this._globalDescSetData = this.getGlobalDescriptorSetData()!; this._globalDescriptorSetLayout = this._globalDescSetData.descriptorSetLayout; - this._globalDescriptorSet = isEnableEffect() ? this._device.createDescriptorSet(new DescriptorSetInfo(this._globalDescriptorSetLayout!)) + this._globalDescriptorSetInfo = new DescriptorSetInfo(this._globalDescriptorSetLayout!); + this._globalDescriptorSet = isEnableEffect() ? this._device.createDescriptorSet(this._globalDescriptorSetInfo) : this._globalDescSetData.descriptorSet; this._globalDSManager.globalDescriptorSet = this.globalDescriptorSet; this.setMacroBool('CC_USE_HDR', this._pipelineSceneData.isHDR); @@ -1496,6 +1500,9 @@ export class WebPipeline implements Pipeline { public get globalDescriptorSet (): DescriptorSet { return this._globalDescriptorSet!; } + public get globalDescriptorSetInfo (): DescriptorSetInfo { + return this._globalDescriptorSetInfo!; + } public get commandBuffers (): CommandBuffer[] { return [this._device.commandBuffer]; } @@ -1814,6 +1821,7 @@ export class WebPipeline implements Pipeline { private _device!: Device; private _globalDSManager!: GlobalDSManager; private _globalDescriptorSet: DescriptorSet | null = null; + private _globalDescriptorSetInfo: DescriptorSetInfo | null = null; private _globalDescriptorSetLayout: DescriptorSetLayout | null = null; private readonly _macros: MacroRecord = {}; private readonly _pipelineSceneData: PipelineSceneData = new PipelineSceneData(); diff --git a/cocos/rendering/planar-shadow-queue.ts b/cocos/rendering/planar-shadow-queue.ts index 110b0991c2e..67e8153e5cc 100644 --- a/cocos/rendering/planar-shadow-queue.ts +++ b/cocos/rendering/planar-shadow-queue.ts @@ -80,17 +80,18 @@ export class PlanarShadowQueue { const subModels = model.subModels; for (let j = 0; j < subModels.length; j++) { const subModel = subModels[j]; - const passes = subModel.passes; - for (let k = 0; k < passes.length; k++) { - const pass = passes[k]; - const batchingScheme = pass.batchingScheme; - if (batchingScheme === BatchingSchemes.INSTANCING) { - instancedBuffer.merge(subModel, k, subModel.planarShader); - this._instancedQueue.queue.add(instancedBuffer); - } else { - this._pendingSubModels.push(subModel); - } - } + // TODO: planar shadow cant use instance + // const passes = subModel.passes; + // for (let k = 0; k < passes.length; k++) { + // const pass = passes[k]; + // const batchingScheme = pass.batchingScheme; + // if (batchingScheme === BatchingSchemes.INSTANCING) { + // instancedBuffer.merge(subModel, k, subModel.planarShader); + // this._instancedQueue.queue.add(instancedBuffer); + // } else { + this._pendingSubModels.push(subModel); + // } + // } } } this._instancedQueue.uploadBuffers(cmdBuff); diff --git a/cocos/root.ts b/cocos/root.ts index a32266b869b..6a83ac22098 100644 --- a/cocos/root.ts +++ b/cocos/root.ts @@ -34,7 +34,7 @@ import { SphereLight } from './render-scene/scene/sphere-light'; import { SpotLight } from './render-scene/scene/spot-light'; import { RenderWindow, IRenderWindowInfo } from './render-scene/core/render-window'; import { ColorAttachment, DepthStencilAttachment, RenderPassInfo, StoreOp, Device, Swapchain, Feature, deviceManager, LegacyRenderMode } from './gfx'; -import { Pipeline, PipelineRuntime } from './rendering/custom/pipeline'; +import { BasicPipeline, PipelineRuntime } from './rendering/custom/pipeline'; import { Batcher2D } from './2d/renderer/batcher-2d'; import { IPipelineEvent } from './rendering/pipeline-event'; import { localDescriptorSetLayout_ResizeMaxJoints, UBOCamera, UBOGlobal, UBOLocal, UBOShadow, UBOWorldBound } from './rendering/define'; @@ -130,7 +130,7 @@ export class Root { * @en The custom render pipeline * @zh 自定义渲染管线 */ - public get customPipeline (): Pipeline { + public get customPipeline (): BasicPipeline { return this._customPipeline!; } @@ -252,7 +252,7 @@ export class Root { private _pipeline: PipelineRuntime | null = null; private _pipelineEvent: IPipelineEvent | null = null; private _classicPipeline: RenderPipeline | null = null; - private _customPipeline: Pipeline | null = null; + private _customPipeline: BasicPipeline | null = null; private _batcher: Batcher2D | null = null; private _dataPoolMgr: DataPoolManager; private _scenes: RenderScene[] = []; @@ -711,7 +711,7 @@ export class Root { } if (webxrHmdPoseInfos) { - const cameraPosition: number[] = []; + let cameraPosition: number[] = [0, 0, 0]; for (let i = 0; i < webxrHmdPoseInfos.length; i++) { const info = webxrHmdPoseInfos[i]; if ((info.code === XRPoseType.VIEW_LEFT && xrEye === XREye.LEFT) @@ -725,6 +725,10 @@ export class Root { for (const cam of allcameras) { if (cam.trackingType !== TrackingType.NO_TRACKING && cam.node) { + const isTrackingRotation = cam.trackingType === TrackingType.ROTATION; + if (isTrackingRotation) { + cameraPosition = [0, 0, 0]; + } cam.node.setPosition(cameraPosition[0], cameraPosition[1], cameraPosition[2]); } } diff --git a/editor/inspector/assets/material.js b/editor/inspector/assets/material.js index 4adbcfbd6d3..bce97705238 100644 --- a/editor/inspector/assets/material.js +++ b/editor/inspector/assets/material.js @@ -357,7 +357,7 @@ exports.methods = { } if (prop[name] && typeof prop[name] === 'object') { - if (!cacheData.name) { + if (!cacheData[name]) { cacheData[name] = {}; } @@ -393,7 +393,11 @@ exports.methods = { if (JSON.stringify(value) === JSON.stringify(defaultValue)) { delete this.cacheData[name][passIndex]; } else { - this.cacheData[name][passIndex] = JSON.parse(JSON.stringify({ type, value })); + const cacheData = this.cacheData; + if (!cacheData[name]) { + cacheData[name] = {}; + } + cacheData[name][passIndex] = JSON.parse(JSON.stringify({ type, value })); } }, diff --git a/editor/inspector/contributions/asset.js b/editor/inspector/contributions/asset.js index 78a2e5038e9..774235d82be 100644 --- a/editor/inspector/contributions/asset.js +++ b/editor/inspector/contributions/asset.js @@ -1,8 +1,6 @@ 'use strict'; const fs = require('fs'); const path = require('path'); -module.paths.push(path.join(Editor.App.path, 'node_modules')); -const { throttle } = require('lodash'); const History = require('./asset-history/index'); const showImage = ['image', 'texture', 'sprite-frame', 'gltf-mesh']; @@ -58,37 +56,20 @@ const Elements = { panel: { ready() { const panel = this; - - panel.throttleUpdate = throttle(() => { - if (!panel.readyToUpdate) { - return; - } - panel.reset(); - }, 100, { leading: false, trailing: true }); + panel.__assetChangedHandle__ = undefined; panel.__assetChanged__ = (uuid) => { if (Array.isArray(panel.uuidList) && panel.uuidList.includes(uuid)) { - panel.throttleUpdate(); + window.cancelAnimationFrame(panel.__assetChangedHandle__); + panel.__assetChangedHandle__ = window.requestAnimationFrame(async () => { + await panel.reset(); + }); } }; Editor.Message.addBroadcastListener('asset-db:asset-change', panel.__assetChanged__); panel.history = new History(); - - panel._readyToUpdate = true; - Object.defineProperty(panel, 'readyToUpdate', { - enumerable: true, - get() { - return panel._readyToUpdate; - }, - set(val) { - panel._readyToUpdate = val; - if (val) { - panel.throttleUpdate(); - } - }, - }); }, async update() { const panel = this; @@ -169,8 +150,10 @@ const Elements = { close() { const panel = this; - panel.throttleUpdate.cancel(); - panel.throttleUpdate = undefined; + if (panel.__assetChangedHandle__) { + window.cancelAnimationFrame(panel.__assetChangedHandle__); + panel.__assetChangedHandle__ = undefined; + } Editor.Message.removeBroadcastListener('asset-db:asset-change', panel.__assetChanged__); @@ -515,8 +498,6 @@ exports.methods = { return; } - panel.readyToUpdate = false; - // 有些资源在内部的 apply 保存数据后,会自动重导资源,自动更新 meta 数据,所以 meta 不需要再额外更新 let continueSaveMeta = true; @@ -533,7 +514,6 @@ exports.methods = { * return; 是保存成功,且向上冒泡继续保存 meta */ if (saveState === false) { - panel.readyToUpdate = true; return; } else if (saveState === true) { continueSaveMeta = false; @@ -543,7 +523,6 @@ exports.methods = { panel.$.header.removeAttribute('dirty'); if (continueSaveMeta === false) { - panel.readyToUpdate = true; return; } @@ -556,8 +535,6 @@ exports.methods = { panel.metaListOrigin[index] = content; Editor.Message.request('asset-db', 'save-asset-meta', uuid, content); }); - - panel.readyToUpdate = true; }, async abort() { const panel = this; @@ -583,6 +560,10 @@ exports.methods = { } } + if (panel.ready !== true) { + return; + } + panel.$this.update(panel.uuidList, panel.renderMap); }, getHelpUrl(url) { @@ -624,6 +605,7 @@ exports.update = async function update(uuidList, renderMap, dropConfig) { exports.ready = function ready() { const panel = this; + panel.ready = true; for (const prop in Elements) { const element = Elements[prop]; @@ -692,6 +674,7 @@ exports.beforeClose = async function beforeClose() { exports.close = async function close() { const panel = this; + panel.ready = false; for (const prop in Elements) { const element = Elements[prop]; diff --git a/editor/inspector/contributions/node.js b/editor/inspector/contributions/node.js index 5e839dc108f..c0666ef1208 100644 --- a/editor/inspector/contributions/node.js +++ b/editor/inspector/contributions/node.js @@ -494,18 +494,20 @@ const Elements = { }); panel._readyToUpdate = true; - Object.defineProperty(panel, 'readyToUpdate', { - enumerable: true, - get() { - return panel._readyToUpdate; - }, - set(val) { - panel._readyToUpdate = val; - if (val) { - panel.throttleUpdate(); - } - }, - }); + if (panel.readyToUpdate === undefined) { + Object.defineProperty(panel, 'readyToUpdate', { + enumerable: true, + get() { + return panel._readyToUpdate; + }, + set(val) { + panel._readyToUpdate = val; + if (val) { + panel.throttleUpdate(); + } + }, + }); + } }, async update() { const panel = this; diff --git a/native/cocos/bindings/auto/jsb_gfx_auto.cpp b/native/cocos/bindings/auto/jsb_gfx_auto.cpp index a08e1eabccf..fde9ebc6f1c 100644 --- a/native/cocos/bindings/auto/jsb_gfx_auto.cpp +++ b/native/cocos/bindings/auto/jsb_gfx_auto.cpp @@ -13739,7 +13739,7 @@ static bool js_cc_gfx_SubpassDependency_generalBarrier_get(se::State& s) } SE_BIND_PROP_GET(js_cc_gfx_SubpassDependency_generalBarrier_get) -static bool js_cc_gfx_SubpassDependency_bufferBarriers_set(se::State& s) +static bool js_cc_gfx_SubpassDependency_prevAccesses_set(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); @@ -13749,136 +13749,34 @@ static bool js_cc_gfx_SubpassDependency_bufferBarriers_set(se::State& s) arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - ok &= sevalue_to_native(args[0], &arg1->bufferBarriers, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - - return true; -} -SE_BIND_PROP_SET(js_cc_gfx_SubpassDependency_bufferBarriers_set) - -static bool js_cc_gfx_SubpassDependency_bufferBarriers_get(se::State& s) -{ - CC_UNUSED bool ok = true; - cc::gfx::SubpassDependency *arg1 = (cc::gfx::SubpassDependency *) NULL ; - - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= nativevalue_to_se(arg1->bufferBarriers, s.rval(), s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - SE_HOLD_RETURN_VALUE(arg1->bufferBarriers, s.thisObject(), s.rval()); - - - return true; -} -SE_BIND_PROP_GET(js_cc_gfx_SubpassDependency_bufferBarriers_get) - -static bool js_cc_gfx_SubpassDependency_buffers_set(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - size_t argc = args.size(); - cc::gfx::SubpassDependency *arg1 = (cc::gfx::SubpassDependency *) NULL ; - - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= sevalue_to_native(args[0], &arg1->buffers, s.thisObject()); + ok &= sevalue_to_native(args[0], &arg1->prevAccesses, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - return true; -} -SE_BIND_PROP_SET(js_cc_gfx_SubpassDependency_buffers_set) - -static bool js_cc_gfx_SubpassDependency_buffers_get(se::State& s) -{ - CC_UNUSED bool ok = true; - cc::gfx::SubpassDependency *arg1 = (cc::gfx::SubpassDependency *) NULL ; - - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= nativevalue_to_se(arg1->buffers, s.rval(), s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - SE_HOLD_RETURN_VALUE(arg1->buffers, s.thisObject(), s.rval()); - return true; } -SE_BIND_PROP_GET(js_cc_gfx_SubpassDependency_buffers_get) +SE_BIND_PROP_SET(js_cc_gfx_SubpassDependency_prevAccesses_set) -static bool js_cc_gfx_SubpassDependency_bufferBarrierCount_set(se::State& s) +static bool js_cc_gfx_SubpassDependency_prevAccesses_get(se::State& s) { CC_UNUSED bool ok = true; - const auto& args = s.args(); - size_t argc = args.size(); cc::gfx::SubpassDependency *arg1 = (cc::gfx::SubpassDependency *) NULL ; arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - ok &= sevalue_to_native(args[0], &arg1->bufferBarrierCount, s.thisObject()); + ok &= nativevalue_to_se(arg1->prevAccesses, s.rval(), s.thisObject() /*ctx*/); SE_PRECONDITION2(ok, false, "Error processing arguments"); + SE_HOLD_RETURN_VALUE(arg1->prevAccesses, s.thisObject(), s.rval()); return true; } -SE_BIND_PROP_SET(js_cc_gfx_SubpassDependency_bufferBarrierCount_set) - -static bool js_cc_gfx_SubpassDependency_bufferBarrierCount_get(se::State& s) -{ - CC_UNUSED bool ok = true; - cc::gfx::SubpassDependency *arg1 = (cc::gfx::SubpassDependency *) NULL ; - - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= nativevalue_to_se(arg1->bufferBarrierCount, s.rval(), s.thisObject()); - - - return true; -} -SE_BIND_PROP_GET(js_cc_gfx_SubpassDependency_bufferBarrierCount_get) - -static bool js_cc_gfx_SubpassDependency_textureBarriers_set(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - size_t argc = args.size(); - cc::gfx::SubpassDependency *arg1 = (cc::gfx::SubpassDependency *) NULL ; - - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= sevalue_to_native(args[0], &arg1->textureBarriers, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - - return true; -} -SE_BIND_PROP_SET(js_cc_gfx_SubpassDependency_textureBarriers_set) - -static bool js_cc_gfx_SubpassDependency_textureBarriers_get(se::State& s) -{ - CC_UNUSED bool ok = true; - cc::gfx::SubpassDependency *arg1 = (cc::gfx::SubpassDependency *) NULL ; - - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= nativevalue_to_se(arg1->textureBarriers, s.rval(), s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - SE_HOLD_RETURN_VALUE(arg1->textureBarriers, s.thisObject(), s.rval()); - - - return true; -} -SE_BIND_PROP_GET(js_cc_gfx_SubpassDependency_textureBarriers_get) +SE_BIND_PROP_GET(js_cc_gfx_SubpassDependency_prevAccesses_get) -static bool js_cc_gfx_SubpassDependency_textures_set(se::State& s) +static bool js_cc_gfx_SubpassDependency_nextAccesses_set(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); @@ -13888,64 +13786,32 @@ static bool js_cc_gfx_SubpassDependency_textures_set(se::State& s) arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - ok &= sevalue_to_native(args[0], &arg1->textures, s.thisObject()); + ok &= sevalue_to_native(args[0], &arg1->nextAccesses, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - return true; -} -SE_BIND_PROP_SET(js_cc_gfx_SubpassDependency_textures_set) - -static bool js_cc_gfx_SubpassDependency_textures_get(se::State& s) -{ - CC_UNUSED bool ok = true; - cc::gfx::SubpassDependency *arg1 = (cc::gfx::SubpassDependency *) NULL ; - - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= nativevalue_to_se(arg1->textures, s.rval(), s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - SE_HOLD_RETURN_VALUE(arg1->textures, s.thisObject(), s.rval()); - return true; } -SE_BIND_PROP_GET(js_cc_gfx_SubpassDependency_textures_get) +SE_BIND_PROP_SET(js_cc_gfx_SubpassDependency_nextAccesses_set) -static bool js_cc_gfx_SubpassDependency_textureBarrierCount_set(se::State& s) +static bool js_cc_gfx_SubpassDependency_nextAccesses_get(se::State& s) { CC_UNUSED bool ok = true; - const auto& args = s.args(); - size_t argc = args.size(); cc::gfx::SubpassDependency *arg1 = (cc::gfx::SubpassDependency *) NULL ; arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - ok &= sevalue_to_native(args[0], &arg1->textureBarrierCount, s.thisObject()); + ok &= nativevalue_to_se(arg1->nextAccesses, s.rval(), s.thisObject() /*ctx*/); SE_PRECONDITION2(ok, false, "Error processing arguments"); + SE_HOLD_RETURN_VALUE(arg1->nextAccesses, s.thisObject(), s.rval()); return true; } -SE_BIND_PROP_SET(js_cc_gfx_SubpassDependency_textureBarrierCount_set) - -static bool js_cc_gfx_SubpassDependency_textureBarrierCount_get(se::State& s) -{ - CC_UNUSED bool ok = true; - cc::gfx::SubpassDependency *arg1 = (cc::gfx::SubpassDependency *) NULL ; - - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= nativevalue_to_se(arg1->textureBarrierCount, s.rval(), s.thisObject()); - - - return true; -} -SE_BIND_PROP_GET(js_cc_gfx_SubpassDependency_textureBarrierCount_get) +SE_BIND_PROP_GET(js_cc_gfx_SubpassDependency_nextAccesses_get) static bool js_cc_gfx_SubpassDependency_copy(se::State& s) { @@ -14032,39 +13898,15 @@ bool sevalue_to_native(const se::Value &from, cc::gfx::SubpassDependency * to, s } - json->getProperty("bufferBarriers", &field, true); - if (!field.isNullOrUndefined()) { - ok &= sevalue_to_native(field, &(to->bufferBarriers), ctx); - } - - - json->getProperty("buffers", &field, true); - if (!field.isNullOrUndefined()) { - ok &= sevalue_to_native(field, &(to->buffers), ctx); - } - - - json->getProperty("bufferBarrierCount", &field, true); - if (!field.isNullOrUndefined()) { - ok &= sevalue_to_native(field, &(to->bufferBarrierCount), ctx); - } - - - json->getProperty("textureBarriers", &field, true); - if (!field.isNullOrUndefined()) { - ok &= sevalue_to_native(field, &(to->textureBarriers), ctx); - } - - - json->getProperty("textures", &field, true); + json->getProperty("prevAccesses", &field, true); if (!field.isNullOrUndefined()) { - ok &= sevalue_to_native(field, &(to->textures), ctx); + ok &= sevalue_to_native(field, &(to->prevAccesses), ctx); } - json->getProperty("textureBarrierCount", &field, true); + json->getProperty("nextAccesses", &field, true); if (!field.isNullOrUndefined()) { - ok &= sevalue_to_native(field, &(to->textureBarrierCount), ctx); + ok &= sevalue_to_native(field, &(to->nextAccesses), ctx); } @@ -14079,12 +13921,8 @@ bool js_register_cc_gfx_SubpassDependency(se::Object* obj) { cls->defineProperty("srcSubpass", _SE(js_cc_gfx_SubpassDependency_srcSubpass_get), _SE(js_cc_gfx_SubpassDependency_srcSubpass_set)); cls->defineProperty("dstSubpass", _SE(js_cc_gfx_SubpassDependency_dstSubpass_get), _SE(js_cc_gfx_SubpassDependency_dstSubpass_set)); cls->defineProperty("generalBarrier", _SE(js_cc_gfx_SubpassDependency_generalBarrier_get), _SE(js_cc_gfx_SubpassDependency_generalBarrier_set)); - cls->defineProperty("bufferBarriers", _SE(js_cc_gfx_SubpassDependency_bufferBarriers_get), _SE(js_cc_gfx_SubpassDependency_bufferBarriers_set)); - cls->defineProperty("buffers", _SE(js_cc_gfx_SubpassDependency_buffers_get), _SE(js_cc_gfx_SubpassDependency_buffers_set)); - cls->defineProperty("bufferBarrierCount", _SE(js_cc_gfx_SubpassDependency_bufferBarrierCount_get), _SE(js_cc_gfx_SubpassDependency_bufferBarrierCount_set)); - cls->defineProperty("textureBarriers", _SE(js_cc_gfx_SubpassDependency_textureBarriers_get), _SE(js_cc_gfx_SubpassDependency_textureBarriers_set)); - cls->defineProperty("textures", _SE(js_cc_gfx_SubpassDependency_textures_get), _SE(js_cc_gfx_SubpassDependency_textures_set)); - cls->defineProperty("textureBarrierCount", _SE(js_cc_gfx_SubpassDependency_textureBarrierCount_get), _SE(js_cc_gfx_SubpassDependency_textureBarrierCount_set)); + cls->defineProperty("prevAccesses", _SE(js_cc_gfx_SubpassDependency_prevAccesses_get), _SE(js_cc_gfx_SubpassDependency_prevAccesses_set)); + cls->defineProperty("nextAccesses", _SE(js_cc_gfx_SubpassDependency_nextAccesses_get), _SE(js_cc_gfx_SubpassDependency_nextAccesses_set)); cls->defineFunction("copy", _SE(js_cc_gfx_SubpassDependency_copy)); diff --git a/native/cocos/bindings/auto/jsb_render_auto.cpp b/native/cocos/bindings/auto/jsb_render_auto.cpp index c52ed26436f..ebe3105e289 100644 --- a/native/cocos/bindings/auto/jsb_render_auto.cpp +++ b/native/cocos/bindings/auto/jsb_render_auto.cpp @@ -110,8 +110,8 @@ using namespace cc::render; #define cc_render_RasterSubpassBuilder_showStatistics_set(self_, val_) self_->setShowStatistics(val_) -#define cc_render_RasterPassBuilder_showStatistics_get(self_) self_->getShowStatistics() -#define cc_render_RasterPassBuilder_showStatistics_set(self_, val_) self_->setShowStatistics(val_) +#define cc_render_BasicRenderPassBuilder_showStatistics_get(self_) self_->getShowStatistics() +#define cc_render_BasicRenderPassBuilder_showStatistics_set(self_, val_) self_->setShowStatistics(val_) #define cc_render_SceneVisitor_pipelineSceneData_get(self_) self_->getPipelineSceneData() @@ -120,6 +120,9 @@ using namespace cc::render; #define cc_render_SceneTask_taskType_get(self_) self_->getTaskType() +#define cc_render_BasicPipeline_pipelineType_get(self_) self_->getPipelineType() + + se::Class* __jsb_cc_render_PipelineRuntime_class = nullptr; se::Object* __jsb_cc_render_PipelineRuntime_proto = nullptr; @@ -1202,6 +1205,30 @@ static bool js_cc_render_Setter_setSampler(se::State& s) } SE_BIND_FUNC(js_cc_render_Setter_setSampler) +static bool js_cc_render_Setter_setCamera(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + cc::render::Setter *arg1 = (cc::render::Setter *) NULL ; + cc::scene::Camera *arg2 = (cc::scene::Camera *) NULL ; + + if(argc != 1) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1); + return false; + } + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + (arg1)->setCamera((cc::scene::Camera const *)arg2); + + + return true; +} +SE_BIND_FUNC(js_cc_render_Setter_setCamera) + static bool js_delete_cc_render_Setter(se::State& s) { return true; @@ -1225,6 +1252,7 @@ bool js_register_cc_render_Setter(se::Object* obj) { cls->defineFunction("setReadWriteBuffer", _SE(js_cc_render_Setter_setReadWriteBuffer)); cls->defineFunction("setReadWriteTexture", _SE(js_cc_render_Setter_setReadWriteTexture)); cls->defineFunction("setSampler", _SE(js_cc_render_Setter_setSampler)); + cls->defineFunction("setCamera", _SE(js_cc_render_Setter_setCamera)); @@ -1279,22 +1307,19 @@ static bool js_cc_render_RasterQueueBuilder_addScene__SWIG_0(se::State& s) CC_UNUSED bool ok = true; const auto& args = s.args(); cc::render::RasterQueueBuilder *arg1 = (cc::render::RasterQueueBuilder *) NULL ; - ccstd::string *arg2 = 0 ; + cc::scene::RenderScene *arg2 = (cc::scene::RenderScene *) NULL ; SceneFlags arg3 ; - ccstd::string temp2 ; arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg2 = &temp2; - + ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - (arg1)->addScene((ccstd::string const &)*arg2,arg3); + (arg1)->addScene((cc::scene::RenderScene const *)arg2,arg3); return true; @@ -1492,17 +1517,14 @@ static bool js_cc_render_RasterQueueBuilder_addScene__SWIG_1(se::State& s) CC_UNUSED bool ok = true; const auto& args = s.args(); cc::render::RasterQueueBuilder *arg1 = (cc::render::RasterQueueBuilder *) NULL ; - ccstd::string *arg2 = 0 ; - ccstd::string temp2 ; + cc::scene::RenderScene *arg2 = (cc::scene::RenderScene *) NULL ; arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg2 = &temp2; - - (arg1)->addScene((ccstd::string const &)*arg2); + ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + (arg1)->addScene((cc::scene::RenderScene const *)arg2); return true; @@ -1855,22 +1877,20 @@ static bool js_cc_render_RasterSubpassBuilder_addTexture(se::State& s) } SE_BIND_FUNC(js_cc_render_RasterSubpassBuilder_addTexture) -static bool js_cc_render_RasterSubpassBuilder_addStorageBuffer(se::State& s) +static bool js_cc_render_RasterSubpassBuilder_addStorageBuffer__SWIG_0(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - size_t argc = args.size(); cc::render::RasterSubpassBuilder *arg1 = (cc::render::RasterSubpassBuilder *) NULL ; ccstd::string *arg2 = 0 ; AccessType arg3 ; ccstd::string *arg4 = 0 ; + ClearValueType arg5 ; + ClearValue *arg6 = 0 ; ccstd::string temp2 ; ccstd::string temp4 ; + ClearValue temp6 ; - if(argc != 3) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 3); - return false; - } arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; @@ -1887,29 +1907,35 @@ static bool js_cc_render_RasterSubpassBuilder_addStorageBuffer(se::State& s) SE_PRECONDITION2(ok, false, "Error processing arguments"); arg4 = &temp4; - (arg1)->addStorageBuffer((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4); + + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[4], &temp6, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg6 = &temp6; + + (arg1)->addStorageBuffer((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4,arg5,(ClearValue const &)*arg6); return true; } -SE_BIND_FUNC(js_cc_render_RasterSubpassBuilder_addStorageBuffer) -static bool js_cc_render_RasterSubpassBuilder_addStorageImage(se::State& s) +static bool js_cc_render_RasterSubpassBuilder_addStorageImage__SWIG_0(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - size_t argc = args.size(); cc::render::RasterSubpassBuilder *arg1 = (cc::render::RasterSubpassBuilder *) NULL ; ccstd::string *arg2 = 0 ; AccessType arg3 ; ccstd::string *arg4 = 0 ; + ClearValueType arg5 ; + ClearValue *arg6 = 0 ; ccstd::string temp2 ; ccstd::string temp4 ; + ClearValue temp6 ; - if(argc != 3) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 3); - return false; - } arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; @@ -1926,12 +1952,20 @@ static bool js_cc_render_RasterSubpassBuilder_addStorageImage(se::State& s) SE_PRECONDITION2(ok, false, "Error processing arguments"); arg4 = &temp4; - (arg1)->addStorageImage((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4); + + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[4], &temp6, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg6 = &temp6; + + (arg1)->addStorageImage((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4,arg5,(ClearValue const &)*arg6); return true; } -SE_BIND_FUNC(js_cc_render_RasterSubpassBuilder_addStorageImage) static bool js_cc_render_RasterSubpassBuilder_addComputeView(se::State& s) { @@ -2468,70 +2502,98 @@ static bool js_cc_render_RasterSubpassBuilder_addDepthStencil(se::State& s) } SE_BIND_FUNC(js_cc_render_RasterSubpassBuilder_addDepthStencil) -static bool js_cc_render_RasterSubpassBuilder_addQueue__SWIG_1(se::State& s) +static bool js_cc_render_RasterSubpassBuilder_addStorageBuffer__SWIG_1(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); cc::render::RasterSubpassBuilder *arg1 = (cc::render::RasterSubpassBuilder *) NULL ; - cc::render::RasterQueueBuilder *result = 0 ; + ccstd::string *arg2 = 0 ; + AccessType arg3 ; + ccstd::string *arg4 = 0 ; + ccstd::string temp2 ; + ccstd::string temp4 ; arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - result = (cc::render::RasterQueueBuilder *)(arg1)->addQueue(); - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); + arg2 = &temp2; + + + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg4 = &temp4; + + (arg1)->addStorageBuffer((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4); return true; } -static bool js_cc_render_RasterSubpassBuilder_addQueue__SWIG_2(se::State& s) +static bool js_cc_render_RasterSubpassBuilder_addStorageBuffer__SWIG_2(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); cc::render::RasterSubpassBuilder *arg1 = (cc::render::RasterSubpassBuilder *) NULL ; - QueueHint arg2 ; - cc::render::RasterQueueBuilder *result = 0 ; + ccstd::string *arg2 = 0 ; + AccessType arg3 ; + ccstd::string *arg4 = 0 ; + ClearValueType arg5 ; + ccstd::string temp2 ; + ccstd::string temp4 ; arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - result = (cc::render::RasterQueueBuilder *)(arg1)->addQueue(arg2); - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); + arg4 = &temp4; + + + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + (arg1)->addStorageBuffer((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4,arg5); return true; } -static bool js_cc_render_RasterSubpassBuilder_addQueue(se::State& s) +static bool js_cc_render_RasterSubpassBuilder_addStorageBuffer(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - if (argc == 2) { - ok = js_cc_render_RasterSubpassBuilder_addQueue__SWIG_0(s); + if (argc == 5) { + ok = js_cc_render_RasterSubpassBuilder_addStorageBuffer__SWIG_0(s); if (ok) { return true; } } - if (argc == 0) { - ok = js_cc_render_RasterSubpassBuilder_addQueue__SWIG_1(s); + if (argc == 3) { + ok = js_cc_render_RasterSubpassBuilder_addStorageBuffer__SWIG_1(s); if (ok) { return true; } } - if (argc == 1) { - ok = js_cc_render_RasterSubpassBuilder_addQueue__SWIG_2(s); + if (argc == 4) { + ok = js_cc_render_RasterSubpassBuilder_addStorageBuffer__SWIG_2(s); if (ok) { return true; } @@ -2539,147 +2601,321 @@ static bool js_cc_render_RasterSubpassBuilder_addQueue(se::State& s) SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); return false; } -SE_BIND_FUNC(js_cc_render_RasterSubpassBuilder_addQueue) +SE_BIND_FUNC(js_cc_render_RasterSubpassBuilder_addStorageBuffer) -static bool js_cc_render_RasterSubpassBuilder_showStatistics_set(se::State& s) +static bool js_cc_render_RasterSubpassBuilder_addStorageImage__SWIG_1(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - size_t argc = args.size(); - cc::render::RasterSubpassBuilder *arg1 = (cc::render::RasterSubpassBuilder *) NULL ; - bool arg2 ; - - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= sevalue_to_native(args[0], &arg2); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - cc_render_RasterSubpassBuilder_showStatistics_set(arg1,arg2); - - - return true; -} -SE_BIND_PROP_SET(js_cc_render_RasterSubpassBuilder_showStatistics_set) - -static bool js_cc_render_RasterSubpassBuilder_showStatistics_get(se::State& s) -{ - CC_UNUSED bool ok = true; cc::render::RasterSubpassBuilder *arg1 = (cc::render::RasterSubpassBuilder *) NULL ; - bool result; + ccstd::string *arg2 = 0 ; + AccessType arg3 ; + ccstd::string *arg4 = 0 ; + ccstd::string temp2 ; + ccstd::string temp4 ; arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - result = (bool)cc_render_RasterSubpassBuilder_showStatistics_get(arg1); - - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); - - - return true; -} -SE_BIND_PROP_GET(js_cc_render_RasterSubpassBuilder_showStatistics_get) - -static bool js_delete_cc_render_RasterSubpassBuilder(se::State& s) -{ - return true; -} -SE_BIND_FINALIZE_FUNC(js_delete_cc_render_RasterSubpassBuilder) - -bool js_register_cc_render_RasterSubpassBuilder(se::Object* obj) { - auto* cls = se::Class::create("RasterSubpassBuilder", obj, __jsb_cc_render_Setter_proto, nullptr); - - cls->defineStaticProperty("__isJSB", se::Value(true), se::PropertyAttribute::READ_ONLY | se::PropertyAttribute::DONT_ENUM | se::PropertyAttribute::DONT_DELETE); - cls->defineProperty("showStatistics", _SE(js_cc_render_RasterSubpassBuilder_showStatistics_get), _SE(js_cc_render_RasterSubpassBuilder_showStatistics_set)); - cls->defineFunction("addTexture", _SE(js_cc_render_RasterSubpassBuilder_addTexture)); - cls->defineFunction("addStorageBuffer", _SE(js_cc_render_RasterSubpassBuilder_addStorageBuffer)); - cls->defineFunction("addStorageImage", _SE(js_cc_render_RasterSubpassBuilder_addStorageImage)); - cls->defineFunction("addComputeView", _SE(js_cc_render_RasterSubpassBuilder_addComputeView)); - cls->defineFunction("setViewport", _SE(js_cc_render_RasterSubpassBuilder_setViewport)); - cls->defineFunction("setCustomShaderStages", _SE(js_cc_render_RasterSubpassBuilder_setCustomShaderStages)); - cls->defineFunction("addRenderTarget", _SE(js_cc_render_RasterSubpassBuilder_addRenderTarget)); - cls->defineFunction("addDepthStencil", _SE(js_cc_render_RasterSubpassBuilder_addDepthStencil)); - cls->defineFunction("addQueue", _SE(js_cc_render_RasterSubpassBuilder_addQueue)); + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); - cls->defineFinalizeFunction(_SE(js_delete_cc_render_RasterSubpassBuilder)); + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg4 = &temp4; + (arg1)->addStorageImage((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4); - cls->install(); - JSBClassType::registerClass(cls); - __jsb_cc_render_RasterSubpassBuilder_proto = cls->getProto(); - __jsb_cc_render_RasterSubpassBuilder_class = cls; - se::ScriptEngine::getInstance()->clearException(); return true; } - -se::Class* __jsb_cc_render_ComputeQueueBuilder_class = nullptr; -se::Object* __jsb_cc_render_ComputeQueueBuilder_proto = nullptr; -SE_DECLARE_FINALIZE_FUNC(js_delete_cc_render_ComputeQueueBuilder) - -static bool js_cc_render_ComputeQueueBuilder_addDispatch__SWIG_0(se::State& s) +static bool js_cc_render_RasterSubpassBuilder_addStorageImage__SWIG_2(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::ComputeQueueBuilder *arg1 = (cc::render::ComputeQueueBuilder *) NULL ; - uint32_t arg2 ; - uint32_t arg3 ; - uint32_t arg4 ; - Material *arg5 = (Material *) NULL ; - uint32_t arg6 ; + cc::render::RasterSubpassBuilder *arg1 = (cc::render::RasterSubpassBuilder *) NULL ; + ccstd::string *arg2 = 0 ; + AccessType arg3 ; + ccstd::string *arg4 = 0 ; + ClearValueType arg5 ; + ccstd::string temp2 ; + ccstd::string temp4 ; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); + SE_PRECONDITION2(ok, false, "Error processing arguments"); - ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg4 = &temp4; ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - ok &= sevalue_to_native(args[4], &arg6, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - (arg1)->addDispatch(arg2,arg3,arg4,arg5,arg6); + (arg1)->addStorageImage((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4,arg5); return true; } -static bool js_cc_render_ComputeQueueBuilder_addDispatch__SWIG_1(se::State& s) +static bool js_cc_render_RasterSubpassBuilder_addStorageImage(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::ComputeQueueBuilder *arg1 = (cc::render::ComputeQueueBuilder *) NULL ; - uint32_t arg2 ; - uint32_t arg3 ; - uint32_t arg4 ; - - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - - ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - + size_t argc = args.size(); - ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); + + if (argc == 5) { + ok = js_cc_render_RasterSubpassBuilder_addStorageImage__SWIG_0(s); + if (ok) { + return true; + } + } + if (argc == 3) { + ok = js_cc_render_RasterSubpassBuilder_addStorageImage__SWIG_1(s); + if (ok) { + return true; + } + } + if (argc == 4) { + ok = js_cc_render_RasterSubpassBuilder_addStorageImage__SWIG_2(s); + if (ok) { + return true; + } + } + SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); + return false; +} +SE_BIND_FUNC(js_cc_render_RasterSubpassBuilder_addStorageImage) + +static bool js_cc_render_RasterSubpassBuilder_addQueue__SWIG_1(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::RasterSubpassBuilder *arg1 = (cc::render::RasterSubpassBuilder *) NULL ; + cc::render::RasterQueueBuilder *result = 0 ; + + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + result = (cc::render::RasterQueueBuilder *)(arg1)->addQueue(); + + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); + + + return true; +} + +static bool js_cc_render_RasterSubpassBuilder_addQueue__SWIG_2(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::RasterSubpassBuilder *arg1 = (cc::render::RasterSubpassBuilder *) NULL ; + QueueHint arg2 ; + cc::render::RasterQueueBuilder *result = 0 ; + + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + result = (cc::render::RasterQueueBuilder *)(arg1)->addQueue(arg2); + + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); + + + return true; +} + +static bool js_cc_render_RasterSubpassBuilder_addQueue(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + + + if (argc == 2) { + ok = js_cc_render_RasterSubpassBuilder_addQueue__SWIG_0(s); + if (ok) { + return true; + } + } + if (argc == 0) { + ok = js_cc_render_RasterSubpassBuilder_addQueue__SWIG_1(s); + if (ok) { + return true; + } + } + if (argc == 1) { + ok = js_cc_render_RasterSubpassBuilder_addQueue__SWIG_2(s); + if (ok) { + return true; + } + } + SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); + return false; +} +SE_BIND_FUNC(js_cc_render_RasterSubpassBuilder_addQueue) + +static bool js_cc_render_RasterSubpassBuilder_showStatistics_set(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + cc::render::RasterSubpassBuilder *arg1 = (cc::render::RasterSubpassBuilder *) NULL ; + bool arg2 ; + + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &arg2); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + cc_render_RasterSubpassBuilder_showStatistics_set(arg1,arg2); + + + return true; +} +SE_BIND_PROP_SET(js_cc_render_RasterSubpassBuilder_showStatistics_set) + +static bool js_cc_render_RasterSubpassBuilder_showStatistics_get(se::State& s) +{ + CC_UNUSED bool ok = true; + cc::render::RasterSubpassBuilder *arg1 = (cc::render::RasterSubpassBuilder *) NULL ; + bool result; + + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + result = (bool)cc_render_RasterSubpassBuilder_showStatistics_get(arg1); + + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + + + return true; +} +SE_BIND_PROP_GET(js_cc_render_RasterSubpassBuilder_showStatistics_get) + +static bool js_delete_cc_render_RasterSubpassBuilder(se::State& s) +{ + return true; +} +SE_BIND_FINALIZE_FUNC(js_delete_cc_render_RasterSubpassBuilder) + +bool js_register_cc_render_RasterSubpassBuilder(se::Object* obj) { + auto* cls = se::Class::create("RasterSubpassBuilder", obj, __jsb_cc_render_Setter_proto, nullptr); + + cls->defineStaticProperty("__isJSB", se::Value(true), se::PropertyAttribute::READ_ONLY | se::PropertyAttribute::DONT_ENUM | se::PropertyAttribute::DONT_DELETE); + cls->defineProperty("showStatistics", _SE(js_cc_render_RasterSubpassBuilder_showStatistics_get), _SE(js_cc_render_RasterSubpassBuilder_showStatistics_set)); + + cls->defineFunction("addTexture", _SE(js_cc_render_RasterSubpassBuilder_addTexture)); + cls->defineFunction("addComputeView", _SE(js_cc_render_RasterSubpassBuilder_addComputeView)); + cls->defineFunction("setViewport", _SE(js_cc_render_RasterSubpassBuilder_setViewport)); + cls->defineFunction("setCustomShaderStages", _SE(js_cc_render_RasterSubpassBuilder_setCustomShaderStages)); + cls->defineFunction("addRenderTarget", _SE(js_cc_render_RasterSubpassBuilder_addRenderTarget)); + cls->defineFunction("addDepthStencil", _SE(js_cc_render_RasterSubpassBuilder_addDepthStencil)); + cls->defineFunction("addStorageBuffer", _SE(js_cc_render_RasterSubpassBuilder_addStorageBuffer)); + cls->defineFunction("addStorageImage", _SE(js_cc_render_RasterSubpassBuilder_addStorageImage)); + cls->defineFunction("addQueue", _SE(js_cc_render_RasterSubpassBuilder_addQueue)); + + + + + cls->defineFinalizeFunction(_SE(js_delete_cc_render_RasterSubpassBuilder)); + + + cls->install(); + JSBClassType::registerClass(cls); + + __jsb_cc_render_RasterSubpassBuilder_proto = cls->getProto(); + __jsb_cc_render_RasterSubpassBuilder_class = cls; + se::ScriptEngine::getInstance()->clearException(); + return true; +} + + +se::Class* __jsb_cc_render_ComputeQueueBuilder_class = nullptr; +se::Object* __jsb_cc_render_ComputeQueueBuilder_proto = nullptr; +SE_DECLARE_FINALIZE_FUNC(js_delete_cc_render_ComputeQueueBuilder) + +static bool js_cc_render_ComputeQueueBuilder_addDispatch__SWIG_0(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::ComputeQueueBuilder *arg1 = (cc::render::ComputeQueueBuilder *) NULL ; + uint32_t arg2 ; + uint32_t arg3 ; + uint32_t arg4 ; + Material *arg5 = (Material *) NULL ; + uint32_t arg6 ; + + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + ok &= sevalue_to_native(args[4], &arg6, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + (arg1)->addDispatch(arg2,arg3,arg4,arg5,arg6); + + + return true; +} + +static bool js_cc_render_ComputeQueueBuilder_addDispatch__SWIG_1(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::ComputeQueueBuilder *arg1 = (cc::render::ComputeQueueBuilder *) NULL ; + uint32_t arg2 ; + uint32_t arg3 ; + uint32_t arg4 ; + + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); (arg1)->addDispatch(arg2,arg3,arg4); @@ -2851,22 +3087,20 @@ static bool js_cc_render_ComputeSubpassBuilder_addTexture(se::State& s) } SE_BIND_FUNC(js_cc_render_ComputeSubpassBuilder_addTexture) -static bool js_cc_render_ComputeSubpassBuilder_addStorageBuffer(se::State& s) +static bool js_cc_render_ComputeSubpassBuilder_addStorageBuffer__SWIG_0(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - size_t argc = args.size(); cc::render::ComputeSubpassBuilder *arg1 = (cc::render::ComputeSubpassBuilder *) NULL ; ccstd::string *arg2 = 0 ; AccessType arg3 ; ccstd::string *arg4 = 0 ; + ClearValueType arg5 ; + ClearValue *arg6 = 0 ; ccstd::string temp2 ; ccstd::string temp4 ; + ClearValue temp6 ; - if(argc != 3) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 3); - return false; - } arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; @@ -2883,29 +3117,35 @@ static bool js_cc_render_ComputeSubpassBuilder_addStorageBuffer(se::State& s) SE_PRECONDITION2(ok, false, "Error processing arguments"); arg4 = &temp4; - (arg1)->addStorageBuffer((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4); + + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[4], &temp6, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg6 = &temp6; + + (arg1)->addStorageBuffer((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4,arg5,(ClearValue const &)*arg6); return true; } -SE_BIND_FUNC(js_cc_render_ComputeSubpassBuilder_addStorageBuffer) -static bool js_cc_render_ComputeSubpassBuilder_addStorageImage(se::State& s) +static bool js_cc_render_ComputeSubpassBuilder_addStorageImage__SWIG_0(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - size_t argc = args.size(); cc::render::ComputeSubpassBuilder *arg1 = (cc::render::ComputeSubpassBuilder *) NULL ; ccstd::string *arg2 = 0 ; AccessType arg3 ; ccstd::string *arg4 = 0 ; + ClearValueType arg5 ; + ClearValue *arg6 = 0 ; ccstd::string temp2 ; ccstd::string temp4 ; + ClearValue temp6 ; - if(argc != 3) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 3); - return false; - } arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; @@ -2922,12 +3162,20 @@ static bool js_cc_render_ComputeSubpassBuilder_addStorageImage(se::State& s) SE_PRECONDITION2(ok, false, "Error processing arguments"); arg4 = &temp4; - (arg1)->addStorageImage((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4); + + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[4], &temp6, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg6 = &temp6; + + (arg1)->addStorageImage((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4,arg5,(ClearValue const &)*arg6); return true; } -SE_BIND_FUNC(js_cc_render_ComputeSubpassBuilder_addStorageImage) static bool js_cc_render_ComputeSubpassBuilder_addComputeView(se::State& s) { @@ -3021,6 +3269,208 @@ static bool js_cc_render_ComputeSubpassBuilder_setCustomShaderStages(se::State& } SE_BIND_FUNC(js_cc_render_ComputeSubpassBuilder_setCustomShaderStages) +static bool js_cc_render_ComputeSubpassBuilder_addStorageBuffer__SWIG_1(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::ComputeSubpassBuilder *arg1 = (cc::render::ComputeSubpassBuilder *) NULL ; + ccstd::string *arg2 = 0 ; + AccessType arg3 ; + ccstd::string *arg4 = 0 ; + ccstd::string temp2 ; + ccstd::string temp4 ; + + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg4 = &temp4; + + (arg1)->addStorageBuffer((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4); + + + return true; +} + +static bool js_cc_render_ComputeSubpassBuilder_addStorageBuffer__SWIG_2(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::ComputeSubpassBuilder *arg1 = (cc::render::ComputeSubpassBuilder *) NULL ; + ccstd::string *arg2 = 0 ; + AccessType arg3 ; + ccstd::string *arg4 = 0 ; + ClearValueType arg5 ; + ccstd::string temp2 ; + ccstd::string temp4 ; + + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg4 = &temp4; + + + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + (arg1)->addStorageBuffer((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4,arg5); + + + return true; +} + +static bool js_cc_render_ComputeSubpassBuilder_addStorageBuffer(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + + + if (argc == 5) { + ok = js_cc_render_ComputeSubpassBuilder_addStorageBuffer__SWIG_0(s); + if (ok) { + return true; + } + } + if (argc == 3) { + ok = js_cc_render_ComputeSubpassBuilder_addStorageBuffer__SWIG_1(s); + if (ok) { + return true; + } + } + if (argc == 4) { + ok = js_cc_render_ComputeSubpassBuilder_addStorageBuffer__SWIG_2(s); + if (ok) { + return true; + } + } + SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); + return false; +} +SE_BIND_FUNC(js_cc_render_ComputeSubpassBuilder_addStorageBuffer) + +static bool js_cc_render_ComputeSubpassBuilder_addStorageImage__SWIG_1(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::ComputeSubpassBuilder *arg1 = (cc::render::ComputeSubpassBuilder *) NULL ; + ccstd::string *arg2 = 0 ; + AccessType arg3 ; + ccstd::string *arg4 = 0 ; + ccstd::string temp2 ; + ccstd::string temp4 ; + + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg4 = &temp4; + + (arg1)->addStorageImage((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4); + + + return true; +} + +static bool js_cc_render_ComputeSubpassBuilder_addStorageImage__SWIG_2(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::ComputeSubpassBuilder *arg1 = (cc::render::ComputeSubpassBuilder *) NULL ; + ccstd::string *arg2 = 0 ; + AccessType arg3 ; + ccstd::string *arg4 = 0 ; + ClearValueType arg5 ; + ccstd::string temp2 ; + ccstd::string temp4 ; + + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg4 = &temp4; + + + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + (arg1)->addStorageImage((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4,arg5); + + + return true; +} + +static bool js_cc_render_ComputeSubpassBuilder_addStorageImage(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + + + if (argc == 5) { + ok = js_cc_render_ComputeSubpassBuilder_addStorageImage__SWIG_0(s); + if (ok) { + return true; + } + } + if (argc == 3) { + ok = js_cc_render_ComputeSubpassBuilder_addStorageImage__SWIG_1(s); + if (ok) { + return true; + } + } + if (argc == 4) { + ok = js_cc_render_ComputeSubpassBuilder_addStorageImage__SWIG_2(s); + if (ok) { + return true; + } + } + SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); + return false; +} +SE_BIND_FUNC(js_cc_render_ComputeSubpassBuilder_addStorageImage) + static bool js_cc_render_ComputeSubpassBuilder_addQueue__SWIG_1(se::State& s) { CC_UNUSED bool ok = true; @@ -3077,10 +3527,10 @@ bool js_register_cc_render_ComputeSubpassBuilder(se::Object* obj) { cls->defineFunction("addRenderTarget", _SE(js_cc_render_ComputeSubpassBuilder_addRenderTarget)); cls->defineFunction("addTexture", _SE(js_cc_render_ComputeSubpassBuilder_addTexture)); - cls->defineFunction("addStorageBuffer", _SE(js_cc_render_ComputeSubpassBuilder_addStorageBuffer)); - cls->defineFunction("addStorageImage", _SE(js_cc_render_ComputeSubpassBuilder_addStorageImage)); cls->defineFunction("addComputeView", _SE(js_cc_render_ComputeSubpassBuilder_addComputeView)); cls->defineFunction("setCustomShaderStages", _SE(js_cc_render_ComputeSubpassBuilder_setCustomShaderStages)); + cls->defineFunction("addStorageBuffer", _SE(js_cc_render_ComputeSubpassBuilder_addStorageBuffer)); + cls->defineFunction("addStorageImage", _SE(js_cc_render_ComputeSubpassBuilder_addStorageImage)); cls->defineFunction("addQueue", _SE(js_cc_render_ComputeSubpassBuilder_addQueue)); @@ -3099,15 +3549,15 @@ bool js_register_cc_render_ComputeSubpassBuilder(se::Object* obj) { } -se::Class* __jsb_cc_render_RasterPassBuilder_class = nullptr; -se::Object* __jsb_cc_render_RasterPassBuilder_proto = nullptr; -SE_DECLARE_FINALIZE_FUNC(js_delete_cc_render_RasterPassBuilder) +se::Class* __jsb_cc_render_BasicRenderPassBuilder_class = nullptr; +se::Object* __jsb_cc_render_BasicRenderPassBuilder_proto = nullptr; +SE_DECLARE_FINALIZE_FUNC(js_delete_cc_render_BasicRenderPassBuilder) -static bool js_cc_render_RasterPassBuilder_addRenderTarget__SWIG_0(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_addRenderTarget__SWIG_0(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + cc::render::BasicRenderPassBuilder *arg1 = (cc::render::BasicRenderPassBuilder *) NULL ; ccstd::string *arg2 = 0 ; ccstd::string *arg3 = 0 ; gfx::LoadOp arg4 ; @@ -3117,7 +3567,7 @@ static bool js_cc_render_RasterPassBuilder_addRenderTarget__SWIG_0(se::State& s) ccstd::string temp3 ; gfx::Color temp6 ; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -3148,11 +3598,11 @@ static bool js_cc_render_RasterPassBuilder_addRenderTarget__SWIG_0(se::State& s) return true; } -static bool js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_0(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_addDepthStencil__SWIG_0(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + cc::render::BasicRenderPassBuilder *arg1 = (cc::render::BasicRenderPassBuilder *) NULL ; ccstd::string *arg2 = 0 ; ccstd::string *arg3 = 0 ; gfx::LoadOp arg4 ; @@ -3163,7 +3613,7 @@ static bool js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_0(se::State& s) ccstd::string temp2 ; ccstd::string temp3 ; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -3200,12 +3650,12 @@ static bool js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_0(se::State& s) return true; } -static bool js_cc_render_RasterPassBuilder_addTexture(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_addTexture(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + cc::render::BasicRenderPassBuilder *arg1 = (cc::render::BasicRenderPassBuilder *) NULL ; ccstd::string *arg2 = 0 ; ccstd::string *arg3 = 0 ; ccstd::string temp2 ; @@ -3215,7 +3665,7 @@ static bool js_cc_render_RasterPassBuilder_addTexture(se::State& s) SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 2); return false; } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -3232,25 +3682,24 @@ static bool js_cc_render_RasterPassBuilder_addTexture(se::State& s) return true; } -SE_BIND_FUNC(js_cc_render_RasterPassBuilder_addTexture) +SE_BIND_FUNC(js_cc_render_BasicRenderPassBuilder_addTexture) -static bool js_cc_render_RasterPassBuilder_addStorageBuffer(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_addRasterView(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + cc::render::BasicRenderPassBuilder *arg1 = (cc::render::BasicRenderPassBuilder *) NULL ; ccstd::string *arg2 = 0 ; - AccessType arg3 ; - ccstd::string *arg4 = 0 ; + RasterView *arg3 = 0 ; ccstd::string temp2 ; - ccstd::string temp4 ; + RasterView temp3 ; - if(argc != 3) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 3); + if(argc != 2) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 2); return false; } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -3258,38 +3707,33 @@ static bool js_cc_render_RasterPassBuilder_addStorageBuffer(se::State& s) arg2 = &temp2; - ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - - ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); + ok &= sevalue_to_native(args[1], &temp3, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg4 = &temp4; + arg3 = &temp3; - (arg1)->addStorageBuffer((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4); + (arg1)->addRasterView((ccstd::string const &)*arg2,(RasterView const &)*arg3); return true; } -SE_BIND_FUNC(js_cc_render_RasterPassBuilder_addStorageBuffer) +SE_BIND_FUNC(js_cc_render_BasicRenderPassBuilder_addRasterView) -static bool js_cc_render_RasterPassBuilder_addStorageImage(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_addComputeView(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + cc::render::BasicRenderPassBuilder *arg1 = (cc::render::BasicRenderPassBuilder *) NULL ; ccstd::string *arg2 = 0 ; - AccessType arg3 ; - ccstd::string *arg4 = 0 ; + ComputeView *arg3 = 0 ; ccstd::string temp2 ; - ccstd::string temp4 ; + ComputeView temp3 ; - if(argc != 3) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 3); + if(argc != 2) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 2); return false; } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -3297,100 +3741,28 @@ static bool js_cc_render_RasterPassBuilder_addStorageImage(se::State& s) arg2 = &temp2; - ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); + ok &= sevalue_to_native(args[1], &temp3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg3 = &temp3; - - ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg4 = &temp4; - - (arg1)->addStorageImage((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4); - - - return true; -} -SE_BIND_FUNC(js_cc_render_RasterPassBuilder_addStorageImage) - -static bool js_cc_render_RasterPassBuilder_addRasterView(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - size_t argc = args.size(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; - ccstd::string *arg2 = 0 ; - RasterView *arg3 = 0 ; - ccstd::string temp2 ; - RasterView temp3 ; - - if(argc != 2) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 2); - return false; - } - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg2 = &temp2; - - - ok &= sevalue_to_native(args[1], &temp3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg3 = &temp3; - - (arg1)->addRasterView((ccstd::string const &)*arg2,(RasterView const &)*arg3); - - - return true; -} -SE_BIND_FUNC(js_cc_render_RasterPassBuilder_addRasterView) - -static bool js_cc_render_RasterPassBuilder_addComputeView(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - size_t argc = args.size(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; - ccstd::string *arg2 = 0 ; - ComputeView *arg3 = 0 ; - ccstd::string temp2 ; - ComputeView temp3 ; - - if(argc != 2) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 2); - return false; - } - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg2 = &temp2; - - - ok &= sevalue_to_native(args[1], &temp3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg3 = &temp3; - - (arg1)->addComputeView((ccstd::string const &)*arg2,(ComputeView const &)*arg3); + (arg1)->addComputeView((ccstd::string const &)*arg2,(ComputeView const &)*arg3); return true; } -SE_BIND_FUNC(js_cc_render_RasterPassBuilder_addComputeView) +SE_BIND_FUNC(js_cc_render_BasicRenderPassBuilder_addComputeView) -static bool js_cc_render_RasterPassBuilder_addQueue__SWIG_0(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_addQueue__SWIG_0(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + cc::render::BasicRenderPassBuilder *arg1 = (cc::render::BasicRenderPassBuilder *) NULL ; QueueHint arg2 ; ccstd::string *arg3 = 0 ; ccstd::string temp3 ; cc::render::RasterQueueBuilder *result = 0 ; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); @@ -3403,59 +3775,6 @@ static bool js_cc_render_RasterPassBuilder_addQueue__SWIG_0(se::State& s) result = (cc::render::RasterQueueBuilder *)(arg1)->addQueue(arg2,(ccstd::string const &)*arg3); - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); - s.rval().toObject()->getPrivateObject()->tryAllowDestroyInGC(); - - - return true; -} - -static bool js_cc_render_RasterPassBuilder_addRasterSubpass__SWIG_0(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; - ccstd::string *arg2 = 0 ; - ccstd::string temp2 ; - cc::render::RasterSubpassBuilder *result = 0 ; - - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg2 = &temp2; - - result = (cc::render::RasterSubpassBuilder *)(arg1)->addRasterSubpass((ccstd::string const &)*arg2); - - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); - - - return true; -} - -static bool js_cc_render_RasterPassBuilder_addComputeSubpass__SWIG_0(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; - ccstd::string *arg2 = 0 ; - ccstd::string temp2 ; - cc::render::ComputeSubpassBuilder *result = 0 ; - - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg2 = &temp2; - - result = (cc::render::ComputeSubpassBuilder *)(arg1)->addComputeSubpass((ccstd::string const &)*arg2); - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); @@ -3464,12 +3783,12 @@ static bool js_cc_render_RasterPassBuilder_addComputeSubpass__SWIG_0(se::State& return true; } -static bool js_cc_render_RasterPassBuilder_setViewport(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_setViewport(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + cc::render::BasicRenderPassBuilder *arg1 = (cc::render::BasicRenderPassBuilder *) NULL ; gfx::Viewport *arg2 = 0 ; gfx::Viewport temp2 ; @@ -3477,7 +3796,7 @@ static bool js_cc_render_RasterPassBuilder_setViewport(se::State& s) SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1); return false; } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -3489,14 +3808,14 @@ static bool js_cc_render_RasterPassBuilder_setViewport(se::State& s) return true; } -SE_BIND_FUNC(js_cc_render_RasterPassBuilder_setViewport) +SE_BIND_FUNC(js_cc_render_BasicRenderPassBuilder_setViewport) -static bool js_cc_render_RasterPassBuilder_setVersion(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_setVersion(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + cc::render::BasicRenderPassBuilder *arg1 = (cc::render::BasicRenderPassBuilder *) NULL ; ccstd::string *arg2 = 0 ; uint64_t arg3 ; ccstd::string temp2 ; @@ -3505,7 +3824,7 @@ static bool js_cc_render_RasterPassBuilder_setVersion(se::State& s) SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 2); return false; } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -3521,51 +3840,19 @@ static bool js_cc_render_RasterPassBuilder_setVersion(se::State& s) return true; } -SE_BIND_FUNC(js_cc_render_RasterPassBuilder_setVersion) - -static bool js_cc_render_RasterPassBuilder_setCustomShaderStages(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - size_t argc = args.size(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; - ccstd::string *arg2 = 0 ; - gfx::ShaderStageFlagBit arg3 ; - ccstd::string temp2 ; - - if(argc != 2) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 2); - return false; - } - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg2 = &temp2; - - - ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - (arg1)->setCustomShaderStages((ccstd::string const &)*arg2,arg3); - - - return true; -} -SE_BIND_FUNC(js_cc_render_RasterPassBuilder_setCustomShaderStages) +SE_BIND_FUNC(js_cc_render_BasicRenderPassBuilder_setVersion) -static bool js_cc_render_RasterPassBuilder_addRenderTarget__SWIG_1(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_addRenderTarget__SWIG_1(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + cc::render::BasicRenderPassBuilder *arg1 = (cc::render::BasicRenderPassBuilder *) NULL ; ccstd::string *arg2 = 0 ; ccstd::string *arg3 = 0 ; ccstd::string temp2 ; ccstd::string temp3 ; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -3583,18 +3870,18 @@ static bool js_cc_render_RasterPassBuilder_addRenderTarget__SWIG_1(se::State& s) return true; } -static bool js_cc_render_RasterPassBuilder_addRenderTarget__SWIG_2(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_addRenderTarget__SWIG_2(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + cc::render::BasicRenderPassBuilder *arg1 = (cc::render::BasicRenderPassBuilder *) NULL ; ccstd::string *arg2 = 0 ; ccstd::string *arg3 = 0 ; gfx::LoadOp arg4 ; ccstd::string temp2 ; ccstd::string temp3 ; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -3616,11 +3903,11 @@ static bool js_cc_render_RasterPassBuilder_addRenderTarget__SWIG_2(se::State& s) return true; } -static bool js_cc_render_RasterPassBuilder_addRenderTarget__SWIG_3(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_addRenderTarget__SWIG_3(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + cc::render::BasicRenderPassBuilder *arg1 = (cc::render::BasicRenderPassBuilder *) NULL ; ccstd::string *arg2 = 0 ; ccstd::string *arg3 = 0 ; gfx::LoadOp arg4 ; @@ -3628,7 +3915,7 @@ static bool js_cc_render_RasterPassBuilder_addRenderTarget__SWIG_3(se::State& s) ccstd::string temp2 ; ccstd::string temp3 ; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -3654,7 +3941,7 @@ static bool js_cc_render_RasterPassBuilder_addRenderTarget__SWIG_3(se::State& s) return true; } -static bool js_cc_render_RasterPassBuilder_addRenderTarget(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_addRenderTarget(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); @@ -3662,25 +3949,25 @@ static bool js_cc_render_RasterPassBuilder_addRenderTarget(se::State& s) if (argc == 5) { - ok = js_cc_render_RasterPassBuilder_addRenderTarget__SWIG_0(s); + ok = js_cc_render_BasicRenderPassBuilder_addRenderTarget__SWIG_0(s); if (ok) { return true; } } if (argc == 2) { - ok = js_cc_render_RasterPassBuilder_addRenderTarget__SWIG_1(s); + ok = js_cc_render_BasicRenderPassBuilder_addRenderTarget__SWIG_1(s); if (ok) { return true; } } if (argc == 3) { - ok = js_cc_render_RasterPassBuilder_addRenderTarget__SWIG_2(s); + ok = js_cc_render_BasicRenderPassBuilder_addRenderTarget__SWIG_2(s); if (ok) { return true; } } if (argc == 4) { - ok = js_cc_render_RasterPassBuilder_addRenderTarget__SWIG_3(s); + ok = js_cc_render_BasicRenderPassBuilder_addRenderTarget__SWIG_3(s); if (ok) { return true; } @@ -3688,19 +3975,19 @@ static bool js_cc_render_RasterPassBuilder_addRenderTarget(se::State& s) SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); return false; } -SE_BIND_FUNC(js_cc_render_RasterPassBuilder_addRenderTarget) +SE_BIND_FUNC(js_cc_render_BasicRenderPassBuilder_addRenderTarget) -static bool js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_1(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_addDepthStencil__SWIG_1(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + cc::render::BasicRenderPassBuilder *arg1 = (cc::render::BasicRenderPassBuilder *) NULL ; ccstd::string *arg2 = 0 ; ccstd::string *arg3 = 0 ; ccstd::string temp2 ; ccstd::string temp3 ; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -3718,18 +4005,18 @@ static bool js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_1(se::State& s) return true; } -static bool js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_2(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_addDepthStencil__SWIG_2(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + cc::render::BasicRenderPassBuilder *arg1 = (cc::render::BasicRenderPassBuilder *) NULL ; ccstd::string *arg2 = 0 ; ccstd::string *arg3 = 0 ; gfx::LoadOp arg4 ; ccstd::string temp2 ; ccstd::string temp3 ; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -3751,11 +4038,11 @@ static bool js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_2(se::State& s) return true; } -static bool js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_3(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_addDepthStencil__SWIG_3(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + cc::render::BasicRenderPassBuilder *arg1 = (cc::render::BasicRenderPassBuilder *) NULL ; ccstd::string *arg2 = 0 ; ccstd::string *arg3 = 0 ; gfx::LoadOp arg4 ; @@ -3763,7 +4050,7 @@ static bool js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_3(se::State& s) ccstd::string temp2 ; ccstd::string temp3 ; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -3789,11 +4076,11 @@ static bool js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_3(se::State& s) return true; } -static bool js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_4(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_addDepthStencil__SWIG_4(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + cc::render::BasicRenderPassBuilder *arg1 = (cc::render::BasicRenderPassBuilder *) NULL ; ccstd::string *arg2 = 0 ; ccstd::string *arg3 = 0 ; gfx::LoadOp arg4 ; @@ -3802,7 +4089,7 @@ static bool js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_4(se::State& s) ccstd::string temp2 ; ccstd::string temp3 ; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -3831,11 +4118,11 @@ static bool js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_4(se::State& s) return true; } -static bool js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_5(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_addDepthStencil__SWIG_5(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + cc::render::BasicRenderPassBuilder *arg1 = (cc::render::BasicRenderPassBuilder *) NULL ; ccstd::string *arg2 = 0 ; ccstd::string *arg3 = 0 ; gfx::LoadOp arg4 ; @@ -3845,7 +4132,7 @@ static bool js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_5(se::State& s) ccstd::string temp2 ; ccstd::string temp3 ; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -3878,7 +4165,7 @@ static bool js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_5(se::State& s) return true; } -static bool js_cc_render_RasterPassBuilder_addDepthStencil(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_addDepthStencil(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); @@ -3886,37 +4173,37 @@ static bool js_cc_render_RasterPassBuilder_addDepthStencil(se::State& s) if (argc == 7) { - ok = js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_0(s); + ok = js_cc_render_BasicRenderPassBuilder_addDepthStencil__SWIG_0(s); if (ok) { return true; } } if (argc == 2) { - ok = js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_1(s); + ok = js_cc_render_BasicRenderPassBuilder_addDepthStencil__SWIG_1(s); if (ok) { return true; } } if (argc == 3) { - ok = js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_2(s); + ok = js_cc_render_BasicRenderPassBuilder_addDepthStencil__SWIG_2(s); if (ok) { return true; } } if (argc == 4) { - ok = js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_3(s); + ok = js_cc_render_BasicRenderPassBuilder_addDepthStencil__SWIG_3(s); if (ok) { return true; } } if (argc == 5) { - ok = js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_4(s); + ok = js_cc_render_BasicRenderPassBuilder_addDepthStencil__SWIG_4(s); if (ok) { return true; } } if (argc == 6) { - ok = js_cc_render_RasterPassBuilder_addDepthStencil__SWIG_5(s); + ok = js_cc_render_BasicRenderPassBuilder_addDepthStencil__SWIG_5(s); if (ok) { return true; } @@ -3924,37 +4211,36 @@ static bool js_cc_render_RasterPassBuilder_addDepthStencil(se::State& s) SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); return false; } -SE_BIND_FUNC(js_cc_render_RasterPassBuilder_addDepthStencil) +SE_BIND_FUNC(js_cc_render_BasicRenderPassBuilder_addDepthStencil) -static bool js_cc_render_RasterPassBuilder_addQueue__SWIG_1(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_addQueue__SWIG_1(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + cc::render::BasicRenderPassBuilder *arg1 = (cc::render::BasicRenderPassBuilder *) NULL ; cc::render::RasterQueueBuilder *result = 0 ; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; result = (cc::render::RasterQueueBuilder *)(arg1)->addQueue(); ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); - s.rval().toObject()->getPrivateObject()->tryAllowDestroyInGC(); return true; } -static bool js_cc_render_RasterPassBuilder_addQueue__SWIG_2(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_addQueue__SWIG_2(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + cc::render::BasicRenderPassBuilder *arg1 = (cc::render::BasicRenderPassBuilder *) NULL ; QueueHint arg2 ; cc::render::RasterQueueBuilder *result = 0 ; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); @@ -3965,13 +4251,12 @@ static bool js_cc_render_RasterPassBuilder_addQueue__SWIG_2(se::State& s) ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); - s.rval().toObject()->getPrivateObject()->tryAllowDestroyInGC(); return true; } -static bool js_cc_render_RasterPassBuilder_addQueue(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_addQueue(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); @@ -3979,19 +4264,19 @@ static bool js_cc_render_RasterPassBuilder_addQueue(se::State& s) if (argc == 2) { - ok = js_cc_render_RasterPassBuilder_addQueue__SWIG_0(s); + ok = js_cc_render_BasicRenderPassBuilder_addQueue__SWIG_0(s); if (ok) { return true; } } if (argc == 0) { - ok = js_cc_render_RasterPassBuilder_addQueue__SWIG_1(s); + ok = js_cc_render_BasicRenderPassBuilder_addQueue__SWIG_1(s); if (ok) { return true; } } if (argc == 1) { - ok = js_cc_render_RasterPassBuilder_addQueue__SWIG_2(s); + ok = js_cc_render_BasicRenderPassBuilder_addQueue__SWIG_2(s); if (ok) { return true; } @@ -3999,193 +4284,243 @@ static bool js_cc_render_RasterPassBuilder_addQueue(se::State& s) SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); return false; } -SE_BIND_FUNC(js_cc_render_RasterPassBuilder_addQueue) +SE_BIND_FUNC(js_cc_render_BasicRenderPassBuilder_addQueue) -static bool js_cc_render_RasterPassBuilder_addRasterSubpass__SWIG_1(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_showStatistics_set(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; - cc::render::RasterSubpassBuilder *result = 0 ; + size_t argc = args.size(); + cc::render::BasicRenderPassBuilder *arg1 = (cc::render::BasicRenderPassBuilder *) NULL ; + bool arg2 ; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - result = (cc::render::RasterSubpassBuilder *)(arg1)->addRasterSubpass(); - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); + ok &= sevalue_to_native(args[0], &arg2); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + cc_render_BasicRenderPassBuilder_showStatistics_set(arg1,arg2); return true; } +SE_BIND_PROP_SET(js_cc_render_BasicRenderPassBuilder_showStatistics_set) -static bool js_cc_render_RasterPassBuilder_addRasterSubpass(se::State& s) +static bool js_cc_render_BasicRenderPassBuilder_showStatistics_get(se::State& s) { CC_UNUSED bool ok = true; - const auto& args = s.args(); - size_t argc = args.size(); + cc::render::BasicRenderPassBuilder *arg1 = (cc::render::BasicRenderPassBuilder *) NULL ; + bool result; + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + result = (bool)cc_render_BasicRenderPassBuilder_showStatistics_get(arg1); - if (argc == 1) { - ok = js_cc_render_RasterPassBuilder_addRasterSubpass__SWIG_0(s); - if (ok) { - return true; - } - } - if (argc == 0) { - ok = js_cc_render_RasterPassBuilder_addRasterSubpass__SWIG_1(s); - if (ok) { - return true; - } - } - SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); - return false; + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + + + return true; } -SE_BIND_FUNC(js_cc_render_RasterPassBuilder_addRasterSubpass) +SE_BIND_PROP_GET(js_cc_render_BasicRenderPassBuilder_showStatistics_get) -static bool js_cc_render_RasterPassBuilder_addComputeSubpass__SWIG_1(se::State& s) +static bool js_delete_cc_render_BasicRenderPassBuilder(se::State& s) { - CC_UNUSED bool ok = true; - const auto& args = s.args(); - cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; - cc::render::ComputeSubpassBuilder *result = 0 ; + return true; +} +SE_BIND_FINALIZE_FUNC(js_delete_cc_render_BasicRenderPassBuilder) + +bool js_register_cc_render_BasicRenderPassBuilder(se::Object* obj) { + auto* cls = se::Class::create("BasicRenderPassBuilder", obj, __jsb_cc_render_Setter_proto, nullptr); - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - result = (cc::render::ComputeSubpassBuilder *)(arg1)->addComputeSubpass(); + cls->defineStaticProperty("__isJSB", se::Value(true), se::PropertyAttribute::READ_ONLY | se::PropertyAttribute::DONT_ENUM | se::PropertyAttribute::DONT_DELETE); + cls->defineProperty("showStatistics", _SE(js_cc_render_BasicRenderPassBuilder_showStatistics_get), _SE(js_cc_render_BasicRenderPassBuilder_showStatistics_set)); - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); + cls->defineFunction("addTexture", _SE(js_cc_render_BasicRenderPassBuilder_addTexture)); + cls->defineFunction("addRasterView", _SE(js_cc_render_BasicRenderPassBuilder_addRasterView)); + cls->defineFunction("addComputeView", _SE(js_cc_render_BasicRenderPassBuilder_addComputeView)); + cls->defineFunction("setViewport", _SE(js_cc_render_BasicRenderPassBuilder_setViewport)); + cls->defineFunction("setVersion", _SE(js_cc_render_BasicRenderPassBuilder_setVersion)); + cls->defineFunction("addRenderTarget", _SE(js_cc_render_BasicRenderPassBuilder_addRenderTarget)); + cls->defineFunction("addDepthStencil", _SE(js_cc_render_BasicRenderPassBuilder_addDepthStencil)); + cls->defineFunction("addQueue", _SE(js_cc_render_BasicRenderPassBuilder_addQueue)); + + + cls->defineFinalizeFunction(_SE(js_delete_cc_render_BasicRenderPassBuilder)); + + + cls->install(); + JSBClassType::registerClass(cls); + + __jsb_cc_render_BasicRenderPassBuilder_proto = cls->getProto(); + __jsb_cc_render_BasicRenderPassBuilder_class = cls; + se::ScriptEngine::getInstance()->clearException(); return true; } -static bool js_cc_render_RasterPassBuilder_addComputeSubpass(se::State& s) + +se::Class* __jsb_cc_render_RasterPassBuilder_class = nullptr; +se::Object* __jsb_cc_render_RasterPassBuilder_proto = nullptr; +SE_DECLARE_FINALIZE_FUNC(js_delete_cc_render_RasterPassBuilder) + +static bool js_cc_render_RasterPassBuilder_addStorageBuffer__SWIG_0(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - size_t argc = args.size(); + cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + ccstd::string *arg2 = 0 ; + AccessType arg3 ; + ccstd::string *arg4 = 0 ; + ClearValueType arg5 ; + ClearValue *arg6 = 0 ; + ccstd::string temp2 ; + ccstd::string temp4 ; + ClearValue temp6 ; + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; - if (argc == 1) { - ok = js_cc_render_RasterPassBuilder_addComputeSubpass__SWIG_0(s); - if (ok) { - return true; - } - } - if (argc == 0) { - ok = js_cc_render_RasterPassBuilder_addComputeSubpass__SWIG_1(s); - if (ok) { - return true; - } - } - SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); - return false; + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg4 = &temp4; + + + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[4], &temp6, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg6 = &temp6; + + (arg1)->addStorageBuffer((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4,arg5,(ClearValue const &)*arg6); + + + return true; } -SE_BIND_FUNC(js_cc_render_RasterPassBuilder_addComputeSubpass) -static bool js_cc_render_RasterPassBuilder_showStatistics_set(se::State& s) +static bool js_cc_render_RasterPassBuilder_addStorageImage__SWIG_0(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - size_t argc = args.size(); cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; - bool arg2 ; + ccstd::string *arg2 = 0 ; + AccessType arg3 ; + ccstd::string *arg4 = 0 ; + ClearValueType arg5 ; + ClearValue *arg6 = 0 ; + ccstd::string temp2 ; + ccstd::string temp4 ; + ClearValue temp6 ; arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - ok &= sevalue_to_native(args[0], &arg2); + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg4 = &temp4; + + + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - cc_render_RasterPassBuilder_showStatistics_set(arg1,arg2); + + + ok &= sevalue_to_native(args[4], &temp6, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg6 = &temp6; + + (arg1)->addStorageImage((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4,arg5,(ClearValue const &)*arg6); return true; } -SE_BIND_PROP_SET(js_cc_render_RasterPassBuilder_showStatistics_set) -static bool js_cc_render_RasterPassBuilder_showStatistics_get(se::State& s) +static bool js_cc_render_RasterPassBuilder_addRasterSubpass__SWIG_0(se::State& s) { CC_UNUSED bool ok = true; + const auto& args = s.args(); cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; - bool result; + ccstd::string *arg2 = 0 ; + ccstd::string temp2 ; + cc::render::RasterSubpassBuilder *result = 0 ; arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - result = (bool)cc_render_RasterPassBuilder_showStatistics_get(arg1); + + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + result = (cc::render::RasterSubpassBuilder *)(arg1)->addRasterSubpass((ccstd::string const &)*arg2); ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); return true; } -SE_BIND_PROP_GET(js_cc_render_RasterPassBuilder_showStatistics_get) -static bool js_delete_cc_render_RasterPassBuilder(se::State& s) +static bool js_cc_render_RasterPassBuilder_addComputeSubpass__SWIG_0(se::State& s) { - return true; -} -SE_BIND_FINALIZE_FUNC(js_delete_cc_render_RasterPassBuilder) - -bool js_register_cc_render_RasterPassBuilder(se::Object* obj) { - auto* cls = se::Class::create("RasterPassBuilder", obj, __jsb_cc_render_Setter_proto, nullptr); - - cls->defineStaticProperty("__isJSB", se::Value(true), se::PropertyAttribute::READ_ONLY | se::PropertyAttribute::DONT_ENUM | se::PropertyAttribute::DONT_DELETE); - cls->defineProperty("showStatistics", _SE(js_cc_render_RasterPassBuilder_showStatistics_get), _SE(js_cc_render_RasterPassBuilder_showStatistics_set)); - - cls->defineFunction("addTexture", _SE(js_cc_render_RasterPassBuilder_addTexture)); - cls->defineFunction("addStorageBuffer", _SE(js_cc_render_RasterPassBuilder_addStorageBuffer)); - cls->defineFunction("addStorageImage", _SE(js_cc_render_RasterPassBuilder_addStorageImage)); - cls->defineFunction("addRasterView", _SE(js_cc_render_RasterPassBuilder_addRasterView)); - cls->defineFunction("addComputeView", _SE(js_cc_render_RasterPassBuilder_addComputeView)); - cls->defineFunction("setViewport", _SE(js_cc_render_RasterPassBuilder_setViewport)); - cls->defineFunction("setVersion", _SE(js_cc_render_RasterPassBuilder_setVersion)); - cls->defineFunction("setCustomShaderStages", _SE(js_cc_render_RasterPassBuilder_setCustomShaderStages)); - cls->defineFunction("addRenderTarget", _SE(js_cc_render_RasterPassBuilder_addRenderTarget)); - cls->defineFunction("addDepthStencil", _SE(js_cc_render_RasterPassBuilder_addDepthStencil)); - cls->defineFunction("addQueue", _SE(js_cc_render_RasterPassBuilder_addQueue)); - cls->defineFunction("addRasterSubpass", _SE(js_cc_render_RasterPassBuilder_addRasterSubpass)); - cls->defineFunction("addComputeSubpass", _SE(js_cc_render_RasterPassBuilder_addComputeSubpass)); - + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + ccstd::string *arg2 = 0 ; + ccstd::string temp2 ; + cc::render::ComputeSubpassBuilder *result = 0 ; + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; - cls->defineFinalizeFunction(_SE(js_delete_cc_render_RasterPassBuilder)); + result = (cc::render::ComputeSubpassBuilder *)(arg1)->addComputeSubpass((ccstd::string const &)*arg2); + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); - cls->install(); - JSBClassType::registerClass(cls); - __jsb_cc_render_RasterPassBuilder_proto = cls->getProto(); - __jsb_cc_render_RasterPassBuilder_class = cls; - se::ScriptEngine::getInstance()->clearException(); return true; } - -se::Class* __jsb_cc_render_ComputePassBuilder_class = nullptr; -se::Object* __jsb_cc_render_ComputePassBuilder_proto = nullptr; -SE_DECLARE_FINALIZE_FUNC(js_delete_cc_render_ComputePassBuilder) - -static bool js_cc_render_ComputePassBuilder_addTexture(se::State& s) +static bool js_cc_render_RasterPassBuilder_setCustomShaderStages(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - cc::render::ComputePassBuilder *arg1 = (cc::render::ComputePassBuilder *) NULL ; + cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; ccstd::string *arg2 = 0 ; - ccstd::string *arg3 = 0 ; + gfx::ShaderStageFlagBit arg3 ; ccstd::string temp2 ; - ccstd::string temp3 ; if(argc != 2) { SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 2); return false; } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -4193,34 +4528,28 @@ static bool js_cc_render_ComputePassBuilder_addTexture(se::State& s) arg2 = &temp2; - ok &= sevalue_to_native(args[1], &temp3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg3 = &temp3; + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); - (arg1)->addTexture((ccstd::string const &)*arg2,(ccstd::string const &)*arg3); + (arg1)->setCustomShaderStages((ccstd::string const &)*arg2,arg3); return true; } -SE_BIND_FUNC(js_cc_render_ComputePassBuilder_addTexture) +SE_BIND_FUNC(js_cc_render_RasterPassBuilder_setCustomShaderStages) -static bool js_cc_render_ComputePassBuilder_addStorageBuffer(se::State& s) +static bool js_cc_render_RasterPassBuilder_addStorageBuffer__SWIG_1(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - size_t argc = args.size(); - cc::render::ComputePassBuilder *arg1 = (cc::render::ComputePassBuilder *) NULL ; + cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; ccstd::string *arg2 = 0 ; AccessType arg3 ; ccstd::string *arg4 = 0 ; ccstd::string temp2 ; ccstd::string temp4 ; - if(argc != 3) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 3); - return false; - } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -4241,25 +4570,20 @@ static bool js_cc_render_ComputePassBuilder_addStorageBuffer(se::State& s) return true; } -SE_BIND_FUNC(js_cc_render_ComputePassBuilder_addStorageBuffer) -static bool js_cc_render_ComputePassBuilder_addStorageImage(se::State& s) +static bool js_cc_render_RasterPassBuilder_addStorageBuffer__SWIG_2(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - size_t argc = args.size(); - cc::render::ComputePassBuilder *arg1 = (cc::render::ComputePassBuilder *) NULL ; + cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; ccstd::string *arg2 = 0 ; AccessType arg3 ; ccstd::string *arg4 = 0 ; + ClearValueType arg5 ; ccstd::string temp2 ; ccstd::string temp4 ; - if(argc != 3) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 3); - return false; - } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -4275,29 +4599,58 @@ static bool js_cc_render_ComputePassBuilder_addStorageImage(se::State& s) SE_PRECONDITION2(ok, false, "Error processing arguments"); arg4 = &temp4; - (arg1)->addStorageImage((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4); + + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + (arg1)->addStorageBuffer((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4,arg5); return true; } -SE_BIND_FUNC(js_cc_render_ComputePassBuilder_addStorageImage) -static bool js_cc_render_ComputePassBuilder_addComputeView(se::State& s) +static bool js_cc_render_RasterPassBuilder_addStorageBuffer(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - cc::render::ComputePassBuilder *arg1 = (cc::render::ComputePassBuilder *) NULL ; + + + if (argc == 5) { + ok = js_cc_render_RasterPassBuilder_addStorageBuffer__SWIG_0(s); + if (ok) { + return true; + } + } + if (argc == 3) { + ok = js_cc_render_RasterPassBuilder_addStorageBuffer__SWIG_1(s); + if (ok) { + return true; + } + } + if (argc == 4) { + ok = js_cc_render_RasterPassBuilder_addStorageBuffer__SWIG_2(s); + if (ok) { + return true; + } + } + SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); + return false; +} +SE_BIND_FUNC(js_cc_render_RasterPassBuilder_addStorageBuffer) + +static bool js_cc_render_RasterPassBuilder_addStorageImage__SWIG_1(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; ccstd::string *arg2 = 0 ; - ComputeView *arg3 = 0 ; + AccessType arg3 ; + ccstd::string *arg4 = 0 ; ccstd::string temp2 ; - ComputeView temp3 ; + ccstd::string temp4 ; - if(argc != 2) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 2); - return false; - } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -4305,85 +4658,141 @@ static bool js_cc_render_ComputePassBuilder_addComputeView(se::State& s) arg2 = &temp2; - ok &= sevalue_to_native(args[1], &temp3, s.thisObject()); + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg3 = &temp3; + arg4 = &temp4; - (arg1)->addComputeView((ccstd::string const &)*arg2,(ComputeView const &)*arg3); + (arg1)->addStorageImage((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4); return true; } -SE_BIND_FUNC(js_cc_render_ComputePassBuilder_addComputeView) -static bool js_cc_render_ComputePassBuilder_addQueue__SWIG_0(se::State& s) +static bool js_cc_render_RasterPassBuilder_addStorageImage__SWIG_2(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::ComputePassBuilder *arg1 = (cc::render::ComputePassBuilder *) NULL ; + cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; ccstd::string *arg2 = 0 ; + AccessType arg3 ; + ccstd::string *arg4 = 0 ; + ClearValueType arg5 ; ccstd::string temp2 ; - cc::render::ComputeQueueBuilder *result = 0 ; + ccstd::string temp4 ; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); arg2 = &temp2; - result = (cc::render::ComputeQueueBuilder *)(arg1)->addQueue((ccstd::string const &)*arg2); - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); + arg4 = &temp4; + + + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + (arg1)->addStorageImage((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4,arg5); return true; } -static bool js_cc_render_ComputePassBuilder_setCustomShaderStages(se::State& s) +static bool js_cc_render_RasterPassBuilder_addStorageImage(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - cc::render::ComputePassBuilder *arg1 = (cc::render::ComputePassBuilder *) NULL ; - ccstd::string *arg2 = 0 ; - gfx::ShaderStageFlagBit arg3 ; - ccstd::string temp2 ; - if(argc != 2) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 2); - return false; - } - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg2 = &temp2; + if (argc == 5) { + ok = js_cc_render_RasterPassBuilder_addStorageImage__SWIG_0(s); + if (ok) { + return true; + } + } + if (argc == 3) { + ok = js_cc_render_RasterPassBuilder_addStorageImage__SWIG_1(s); + if (ok) { + return true; + } + } + if (argc == 4) { + ok = js_cc_render_RasterPassBuilder_addStorageImage__SWIG_2(s); + if (ok) { + return true; + } + } + SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); + return false; +} +SE_BIND_FUNC(js_cc_render_RasterPassBuilder_addStorageImage) + +static bool js_cc_render_RasterPassBuilder_addRasterSubpass__SWIG_1(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + cc::render::RasterSubpassBuilder *result = 0 ; - ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + result = (cc::render::RasterSubpassBuilder *)(arg1)->addRasterSubpass(); - (arg1)->setCustomShaderStages((ccstd::string const &)*arg2,arg3); + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); return true; } -SE_BIND_FUNC(js_cc_render_ComputePassBuilder_setCustomShaderStages) -static bool js_cc_render_ComputePassBuilder_addQueue__SWIG_1(se::State& s) +static bool js_cc_render_RasterPassBuilder_addRasterSubpass(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::ComputePassBuilder *arg1 = (cc::render::ComputePassBuilder *) NULL ; - cc::render::ComputeQueueBuilder *result = 0 ; + size_t argc = args.size(); - arg1 = SE_THIS_OBJECT(s); + + if (argc == 1) { + ok = js_cc_render_RasterPassBuilder_addRasterSubpass__SWIG_0(s); + if (ok) { + return true; + } + } + if (argc == 0) { + ok = js_cc_render_RasterPassBuilder_addRasterSubpass__SWIG_1(s); + if (ok) { + return true; + } + } + SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); + return false; +} +SE_BIND_FUNC(js_cc_render_RasterPassBuilder_addRasterSubpass) + +static bool js_cc_render_RasterPassBuilder_addComputeSubpass__SWIG_1(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::RasterPassBuilder *arg1 = (cc::render::RasterPassBuilder *) NULL ; + cc::render::ComputeSubpassBuilder *result = 0 ; + + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - result = (cc::render::ComputeQueueBuilder *)(arg1)->addQueue(); + result = (cc::render::ComputeSubpassBuilder *)(arg1)->addComputeSubpass(); ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); @@ -4393,7 +4802,7 @@ static bool js_cc_render_ComputePassBuilder_addQueue__SWIG_1(se::State& s) return true; } -static bool js_cc_render_ComputePassBuilder_addQueue(se::State& s) +static bool js_cc_render_RasterPassBuilder_addComputeSubpass(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); @@ -4401,13 +4810,13 @@ static bool js_cc_render_ComputePassBuilder_addQueue(se::State& s) if (argc == 1) { - ok = js_cc_render_ComputePassBuilder_addQueue__SWIG_0(s); + ok = js_cc_render_RasterPassBuilder_addComputeSubpass__SWIG_0(s); if (ok) { return true; } } if (argc == 0) { - ok = js_cc_render_ComputePassBuilder_addQueue__SWIG_1(s); + ok = js_cc_render_RasterPassBuilder_addComputeSubpass__SWIG_1(s); if (ok) { return true; } @@ -4415,713 +4824,1529 @@ static bool js_cc_render_ComputePassBuilder_addQueue(se::State& s) SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); return false; } -SE_BIND_FUNC(js_cc_render_ComputePassBuilder_addQueue) +SE_BIND_FUNC(js_cc_render_RasterPassBuilder_addComputeSubpass) -static bool js_delete_cc_render_ComputePassBuilder(se::State& s) +static bool js_delete_cc_render_RasterPassBuilder(se::State& s) { return true; } -SE_BIND_FINALIZE_FUNC(js_delete_cc_render_ComputePassBuilder) +SE_BIND_FINALIZE_FUNC(js_delete_cc_render_RasterPassBuilder) -bool js_register_cc_render_ComputePassBuilder(se::Object* obj) { - auto* cls = se::Class::create("ComputePassBuilder", obj, __jsb_cc_render_Setter_proto, nullptr); +bool js_register_cc_render_RasterPassBuilder(se::Object* obj) { + auto* cls = se::Class::create("RasterPassBuilder", obj, __jsb_cc_render_BasicRenderPassBuilder_proto, nullptr); cls->defineStaticProperty("__isJSB", se::Value(true), se::PropertyAttribute::READ_ONLY | se::PropertyAttribute::DONT_ENUM | se::PropertyAttribute::DONT_DELETE); - cls->defineFunction("addTexture", _SE(js_cc_render_ComputePassBuilder_addTexture)); - cls->defineFunction("addStorageBuffer", _SE(js_cc_render_ComputePassBuilder_addStorageBuffer)); - cls->defineFunction("addStorageImage", _SE(js_cc_render_ComputePassBuilder_addStorageImage)); - cls->defineFunction("addComputeView", _SE(js_cc_render_ComputePassBuilder_addComputeView)); - cls->defineFunction("setCustomShaderStages", _SE(js_cc_render_ComputePassBuilder_setCustomShaderStages)); - cls->defineFunction("addQueue", _SE(js_cc_render_ComputePassBuilder_addQueue)); + cls->defineFunction("setCustomShaderStages", _SE(js_cc_render_RasterPassBuilder_setCustomShaderStages)); + cls->defineFunction("addStorageBuffer", _SE(js_cc_render_RasterPassBuilder_addStorageBuffer)); + cls->defineFunction("addStorageImage", _SE(js_cc_render_RasterPassBuilder_addStorageImage)); + cls->defineFunction("addRasterSubpass", _SE(js_cc_render_RasterPassBuilder_addRasterSubpass)); + cls->defineFunction("addComputeSubpass", _SE(js_cc_render_RasterPassBuilder_addComputeSubpass)); - cls->defineFinalizeFunction(_SE(js_delete_cc_render_ComputePassBuilder)); + cls->defineFinalizeFunction(_SE(js_delete_cc_render_RasterPassBuilder)); cls->install(); - JSBClassType::registerClass(cls); + JSBClassType::registerClass(cls); - __jsb_cc_render_ComputePassBuilder_proto = cls->getProto(); - __jsb_cc_render_ComputePassBuilder_class = cls; + __jsb_cc_render_RasterPassBuilder_proto = cls->getProto(); + __jsb_cc_render_RasterPassBuilder_class = cls; se::ScriptEngine::getInstance()->clearException(); return true; } -se::Class* __jsb_cc_render_MovePassBuilder_class = nullptr; -se::Object* __jsb_cc_render_MovePassBuilder_proto = nullptr; -SE_DECLARE_FINALIZE_FUNC(js_delete_cc_render_MovePassBuilder) +se::Class* __jsb_cc_render_ComputePassBuilder_class = nullptr; +se::Object* __jsb_cc_render_ComputePassBuilder_proto = nullptr; +SE_DECLARE_FINALIZE_FUNC(js_delete_cc_render_ComputePassBuilder) -static bool js_cc_render_MovePassBuilder_addPair(se::State& s) +static bool js_cc_render_ComputePassBuilder_addTexture(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - cc::render::MovePassBuilder *arg1 = (cc::render::MovePassBuilder *) NULL ; - MovePair *arg2 = 0 ; - MovePair temp2 ; + cc::render::ComputePassBuilder *arg1 = (cc::render::ComputePassBuilder *) NULL ; + ccstd::string *arg2 = 0 ; + ccstd::string *arg3 = 0 ; + ccstd::string temp2 ; + ccstd::string temp3 ; - if(argc != 1) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1); + if(argc != 2) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 2); return false; } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); arg2 = &temp2; - (arg1)->addPair((MovePair const &)*arg2); + + ok &= sevalue_to_native(args[1], &temp3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg3 = &temp3; + + (arg1)->addTexture((ccstd::string const &)*arg2,(ccstd::string const &)*arg3); return true; } -SE_BIND_FUNC(js_cc_render_MovePassBuilder_addPair) +SE_BIND_FUNC(js_cc_render_ComputePassBuilder_addTexture) -static bool js_delete_cc_render_MovePassBuilder(se::State& s) +static bool js_cc_render_ComputePassBuilder_addStorageBuffer__SWIG_0(se::State& s) { + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::ComputePassBuilder *arg1 = (cc::render::ComputePassBuilder *) NULL ; + ccstd::string *arg2 = 0 ; + AccessType arg3 ; + ccstd::string *arg4 = 0 ; + ClearValueType arg5 ; + ClearValue *arg6 = 0 ; + ccstd::string temp2 ; + ccstd::string temp4 ; + ClearValue temp6 ; + + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg4 = &temp4; + + + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[4], &temp6, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg6 = &temp6; + + (arg1)->addStorageBuffer((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4,arg5,(ClearValue const &)*arg6); + + return true; } -SE_BIND_FINALIZE_FUNC(js_delete_cc_render_MovePassBuilder) -bool js_register_cc_render_MovePassBuilder(se::Object* obj) { - auto* cls = se::Class::create("MovePassBuilder", obj, __jsb_cc_render_RenderNode_proto, nullptr); +static bool js_cc_render_ComputePassBuilder_addStorageImage__SWIG_0(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::ComputePassBuilder *arg1 = (cc::render::ComputePassBuilder *) NULL ; + ccstd::string *arg2 = 0 ; + AccessType arg3 ; + ccstd::string *arg4 = 0 ; + ClearValueType arg5 ; + ClearValue *arg6 = 0 ; + ccstd::string temp2 ; + ccstd::string temp4 ; + ClearValue temp6 ; - cls->defineStaticProperty("__isJSB", se::Value(true), se::PropertyAttribute::READ_ONLY | se::PropertyAttribute::DONT_ENUM | se::PropertyAttribute::DONT_DELETE); + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; - cls->defineFunction("addPair", _SE(js_cc_render_MovePassBuilder_addPair)); + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); - cls->defineFinalizeFunction(_SE(js_delete_cc_render_MovePassBuilder)); + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg4 = &temp4; - cls->install(); - JSBClassType::registerClass(cls); + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[4], &temp6, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg6 = &temp6; + + (arg1)->addStorageImage((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4,arg5,(ClearValue const &)*arg6); + - __jsb_cc_render_MovePassBuilder_proto = cls->getProto(); - __jsb_cc_render_MovePassBuilder_class = cls; - se::ScriptEngine::getInstance()->clearException(); return true; } +static bool js_cc_render_ComputePassBuilder_addComputeView(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + cc::render::ComputePassBuilder *arg1 = (cc::render::ComputePassBuilder *) NULL ; + ccstd::string *arg2 = 0 ; + ComputeView *arg3 = 0 ; + ccstd::string temp2 ; + ComputeView temp3 ; + + if(argc != 2) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 2); + return false; + } + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + + ok &= sevalue_to_native(args[1], &temp3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg3 = &temp3; + + (arg1)->addComputeView((ccstd::string const &)*arg2,(ComputeView const &)*arg3); + + + return true; +} +SE_BIND_FUNC(js_cc_render_ComputePassBuilder_addComputeView) -se::Class* __jsb_cc_render_CopyPassBuilder_class = nullptr; -se::Object* __jsb_cc_render_CopyPassBuilder_proto = nullptr; -SE_DECLARE_FINALIZE_FUNC(js_delete_cc_render_CopyPassBuilder) +static bool js_cc_render_ComputePassBuilder_addQueue__SWIG_0(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::ComputePassBuilder *arg1 = (cc::render::ComputePassBuilder *) NULL ; + ccstd::string *arg2 = 0 ; + ccstd::string temp2 ; + cc::render::ComputeQueueBuilder *result = 0 ; + + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + result = (cc::render::ComputeQueueBuilder *)(arg1)->addQueue((ccstd::string const &)*arg2); + + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); + + + return true; +} + +static bool js_cc_render_ComputePassBuilder_setCustomShaderStages(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + cc::render::ComputePassBuilder *arg1 = (cc::render::ComputePassBuilder *) NULL ; + ccstd::string *arg2 = 0 ; + gfx::ShaderStageFlagBit arg3 ; + ccstd::string temp2 ; + + if(argc != 2) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 2); + return false; + } + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + (arg1)->setCustomShaderStages((ccstd::string const &)*arg2,arg3); + + + return true; +} +SE_BIND_FUNC(js_cc_render_ComputePassBuilder_setCustomShaderStages) + +static bool js_cc_render_ComputePassBuilder_addStorageBuffer__SWIG_1(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::ComputePassBuilder *arg1 = (cc::render::ComputePassBuilder *) NULL ; + ccstd::string *arg2 = 0 ; + AccessType arg3 ; + ccstd::string *arg4 = 0 ; + ccstd::string temp2 ; + ccstd::string temp4 ; + + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg4 = &temp4; + + (arg1)->addStorageBuffer((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4); + + + return true; +} + +static bool js_cc_render_ComputePassBuilder_addStorageBuffer__SWIG_2(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::ComputePassBuilder *arg1 = (cc::render::ComputePassBuilder *) NULL ; + ccstd::string *arg2 = 0 ; + AccessType arg3 ; + ccstd::string *arg4 = 0 ; + ClearValueType arg5 ; + ccstd::string temp2 ; + ccstd::string temp4 ; + + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg4 = &temp4; + + + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + (arg1)->addStorageBuffer((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4,arg5); + + + return true; +} + +static bool js_cc_render_ComputePassBuilder_addStorageBuffer(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + + + if (argc == 5) { + ok = js_cc_render_ComputePassBuilder_addStorageBuffer__SWIG_0(s); + if (ok) { + return true; + } + } + if (argc == 3) { + ok = js_cc_render_ComputePassBuilder_addStorageBuffer__SWIG_1(s); + if (ok) { + return true; + } + } + if (argc == 4) { + ok = js_cc_render_ComputePassBuilder_addStorageBuffer__SWIG_2(s); + if (ok) { + return true; + } + } + SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); + return false; +} +SE_BIND_FUNC(js_cc_render_ComputePassBuilder_addStorageBuffer) + +static bool js_cc_render_ComputePassBuilder_addStorageImage__SWIG_1(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::ComputePassBuilder *arg1 = (cc::render::ComputePassBuilder *) NULL ; + ccstd::string *arg2 = 0 ; + AccessType arg3 ; + ccstd::string *arg4 = 0 ; + ccstd::string temp2 ; + ccstd::string temp4 ; + + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg4 = &temp4; + + (arg1)->addStorageImage((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4); + + + return true; +} + +static bool js_cc_render_ComputePassBuilder_addStorageImage__SWIG_2(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::ComputePassBuilder *arg1 = (cc::render::ComputePassBuilder *) NULL ; + ccstd::string *arg2 = 0 ; + AccessType arg3 ; + ccstd::string *arg4 = 0 ; + ClearValueType arg5 ; + ccstd::string temp2 ; + ccstd::string temp4 ; + + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg4 = &temp4; + + + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + (arg1)->addStorageImage((ccstd::string const &)*arg2,arg3,(ccstd::string const &)*arg4,arg5); + + + return true; +} + +static bool js_cc_render_ComputePassBuilder_addStorageImage(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + + + if (argc == 5) { + ok = js_cc_render_ComputePassBuilder_addStorageImage__SWIG_0(s); + if (ok) { + return true; + } + } + if (argc == 3) { + ok = js_cc_render_ComputePassBuilder_addStorageImage__SWIG_1(s); + if (ok) { + return true; + } + } + if (argc == 4) { + ok = js_cc_render_ComputePassBuilder_addStorageImage__SWIG_2(s); + if (ok) { + return true; + } + } + SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); + return false; +} +SE_BIND_FUNC(js_cc_render_ComputePassBuilder_addStorageImage) + +static bool js_cc_render_ComputePassBuilder_addQueue__SWIG_1(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::ComputePassBuilder *arg1 = (cc::render::ComputePassBuilder *) NULL ; + cc::render::ComputeQueueBuilder *result = 0 ; + + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + result = (cc::render::ComputeQueueBuilder *)(arg1)->addQueue(); + + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); + + + return true; +} + +static bool js_cc_render_ComputePassBuilder_addQueue(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + + + if (argc == 1) { + ok = js_cc_render_ComputePassBuilder_addQueue__SWIG_0(s); + if (ok) { + return true; + } + } + if (argc == 0) { + ok = js_cc_render_ComputePassBuilder_addQueue__SWIG_1(s); + if (ok) { + return true; + } + } + SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); + return false; +} +SE_BIND_FUNC(js_cc_render_ComputePassBuilder_addQueue) + +static bool js_delete_cc_render_ComputePassBuilder(se::State& s) +{ + return true; +} +SE_BIND_FINALIZE_FUNC(js_delete_cc_render_ComputePassBuilder) + +bool js_register_cc_render_ComputePassBuilder(se::Object* obj) { + auto* cls = se::Class::create("ComputePassBuilder", obj, __jsb_cc_render_Setter_proto, nullptr); + + cls->defineStaticProperty("__isJSB", se::Value(true), se::PropertyAttribute::READ_ONLY | se::PropertyAttribute::DONT_ENUM | se::PropertyAttribute::DONT_DELETE); + + cls->defineFunction("addTexture", _SE(js_cc_render_ComputePassBuilder_addTexture)); + cls->defineFunction("addComputeView", _SE(js_cc_render_ComputePassBuilder_addComputeView)); + cls->defineFunction("setCustomShaderStages", _SE(js_cc_render_ComputePassBuilder_setCustomShaderStages)); + cls->defineFunction("addStorageBuffer", _SE(js_cc_render_ComputePassBuilder_addStorageBuffer)); + cls->defineFunction("addStorageImage", _SE(js_cc_render_ComputePassBuilder_addStorageImage)); + cls->defineFunction("addQueue", _SE(js_cc_render_ComputePassBuilder_addQueue)); + + + + + cls->defineFinalizeFunction(_SE(js_delete_cc_render_ComputePassBuilder)); + + + cls->install(); + JSBClassType::registerClass(cls); + + __jsb_cc_render_ComputePassBuilder_proto = cls->getProto(); + __jsb_cc_render_ComputePassBuilder_class = cls; + se::ScriptEngine::getInstance()->clearException(); + return true; +} + + +se::Class* __jsb_cc_render_MovePassBuilder_class = nullptr; +se::Object* __jsb_cc_render_MovePassBuilder_proto = nullptr; +SE_DECLARE_FINALIZE_FUNC(js_delete_cc_render_MovePassBuilder) + +static bool js_cc_render_MovePassBuilder_addPair(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + cc::render::MovePassBuilder *arg1 = (cc::render::MovePassBuilder *) NULL ; + MovePair *arg2 = 0 ; + MovePair temp2 ; + + if(argc != 1) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1); + return false; + } + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + (arg1)->addPair((MovePair const &)*arg2); + + + return true; +} +SE_BIND_FUNC(js_cc_render_MovePassBuilder_addPair) + +static bool js_delete_cc_render_MovePassBuilder(se::State& s) +{ + return true; +} +SE_BIND_FINALIZE_FUNC(js_delete_cc_render_MovePassBuilder) + +bool js_register_cc_render_MovePassBuilder(se::Object* obj) { + auto* cls = se::Class::create("MovePassBuilder", obj, __jsb_cc_render_RenderNode_proto, nullptr); + + cls->defineStaticProperty("__isJSB", se::Value(true), se::PropertyAttribute::READ_ONLY | se::PropertyAttribute::DONT_ENUM | se::PropertyAttribute::DONT_DELETE); + + cls->defineFunction("addPair", _SE(js_cc_render_MovePassBuilder_addPair)); + + + + + cls->defineFinalizeFunction(_SE(js_delete_cc_render_MovePassBuilder)); + + + cls->install(); + JSBClassType::registerClass(cls); + + __jsb_cc_render_MovePassBuilder_proto = cls->getProto(); + __jsb_cc_render_MovePassBuilder_class = cls; + se::ScriptEngine::getInstance()->clearException(); + return true; +} + + +se::Class* __jsb_cc_render_CopyPassBuilder_class = nullptr; +se::Object* __jsb_cc_render_CopyPassBuilder_proto = nullptr; +SE_DECLARE_FINALIZE_FUNC(js_delete_cc_render_CopyPassBuilder) + +static bool js_cc_render_CopyPassBuilder_addPair(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + cc::render::CopyPassBuilder *arg1 = (cc::render::CopyPassBuilder *) NULL ; + CopyPair *arg2 = 0 ; + CopyPair temp2 ; + + if(argc != 1) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1); + return false; + } + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + (arg1)->addPair((CopyPair const &)*arg2); + + + return true; +} +SE_BIND_FUNC(js_cc_render_CopyPassBuilder_addPair) + +static bool js_delete_cc_render_CopyPassBuilder(se::State& s) +{ + return true; +} +SE_BIND_FINALIZE_FUNC(js_delete_cc_render_CopyPassBuilder) + +bool js_register_cc_render_CopyPassBuilder(se::Object* obj) { + auto* cls = se::Class::create("CopyPassBuilder", obj, __jsb_cc_render_RenderNode_proto, nullptr); + + cls->defineStaticProperty("__isJSB", se::Value(true), se::PropertyAttribute::READ_ONLY | se::PropertyAttribute::DONT_ENUM | se::PropertyAttribute::DONT_DELETE); + + cls->defineFunction("addPair", _SE(js_cc_render_CopyPassBuilder_addPair)); + + + + + cls->defineFinalizeFunction(_SE(js_delete_cc_render_CopyPassBuilder)); + + + cls->install(); + JSBClassType::registerClass(cls); + + __jsb_cc_render_CopyPassBuilder_proto = cls->getProto(); + __jsb_cc_render_CopyPassBuilder_class = cls; + se::ScriptEngine::getInstance()->clearException(); + return true; +} + + +se::Class* __jsb_cc_render_SceneVisitor_class = nullptr; +se::Object* __jsb_cc_render_SceneVisitor_proto = nullptr; +SE_DECLARE_FINALIZE_FUNC(js_delete_cc_render_SceneVisitor) + +static bool js_delete_cc_render_SceneVisitor(se::State& s) +{ + return true; +} +SE_BIND_FINALIZE_FUNC(js_delete_cc_render_SceneVisitor) + +static bool js_cc_render_SceneVisitor_setViewport(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + cc::render::SceneVisitor *arg1 = (cc::render::SceneVisitor *) NULL ; + gfx::Viewport *arg2 = 0 ; + gfx::Viewport temp2 ; + + if(argc != 1) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1); + return false; + } + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + (arg1)->setViewport((gfx::Viewport const &)*arg2); + + + return true; +} +SE_BIND_FUNC(js_cc_render_SceneVisitor_setViewport) + +static bool js_cc_render_SceneVisitor_setScissor(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + cc::render::SceneVisitor *arg1 = (cc::render::SceneVisitor *) NULL ; + gfx::Rect *arg2 = 0 ; + gfx::Rect temp2 ; + + if(argc != 1) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1); + return false; + } + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + (arg1)->setScissor((gfx::Rect const &)*arg2); + + + return true; +} +SE_BIND_FUNC(js_cc_render_SceneVisitor_setScissor) + +static bool js_cc_render_SceneVisitor_bindPipelineState(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + cc::render::SceneVisitor *arg1 = (cc::render::SceneVisitor *) NULL ; + gfx::PipelineState *arg2 = (gfx::PipelineState *) NULL ; + + if(argc != 1) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1); + return false; + } + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + (arg1)->bindPipelineState(arg2); + + + return true; +} +SE_BIND_FUNC(js_cc_render_SceneVisitor_bindPipelineState) + +static bool js_cc_render_SceneVisitor_bindInputAssembler(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + cc::render::SceneVisitor *arg1 = (cc::render::SceneVisitor *) NULL ; + gfx::InputAssembler *arg2 = (gfx::InputAssembler *) NULL ; + + if(argc != 1) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1); + return false; + } + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + (arg1)->bindInputAssembler(arg2); + + + return true; +} +SE_BIND_FUNC(js_cc_render_SceneVisitor_bindInputAssembler) + +static bool js_cc_render_SceneVisitor_draw(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + cc::render::SceneVisitor *arg1 = (cc::render::SceneVisitor *) NULL ; + gfx::DrawInfo *arg2 = 0 ; + gfx::DrawInfo temp2 ; + + if(argc != 1) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1); + return false; + } + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + (arg1)->draw((gfx::DrawInfo const &)*arg2); + + + return true; +} +SE_BIND_FUNC(js_cc_render_SceneVisitor_draw) + +static bool js_cc_render_SceneVisitor_pipelineSceneData_get(se::State& s) +{ + CC_UNUSED bool ok = true; + cc::render::SceneVisitor *arg1 = (cc::render::SceneVisitor *) NULL ; + cc::pipeline::PipelineSceneData *result = 0 ; + + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + result = (cc::pipeline::PipelineSceneData *)cc_render_SceneVisitor_pipelineSceneData_get(arg1); + + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); + + + return true; +} +SE_BIND_PROP_GET(js_cc_render_SceneVisitor_pipelineSceneData_get) + +bool js_register_cc_render_SceneVisitor(se::Object* obj) { + auto* cls = se::Class::create("SceneVisitor", obj, nullptr, nullptr); + + cls->defineStaticProperty("__isJSB", se::Value(true), se::PropertyAttribute::READ_ONLY | se::PropertyAttribute::DONT_ENUM | se::PropertyAttribute::DONT_DELETE); + cls->defineProperty("pipelineSceneData", _SE(js_cc_render_SceneVisitor_pipelineSceneData_get), nullptr); + + cls->defineFunction("setViewport", _SE(js_cc_render_SceneVisitor_setViewport)); + cls->defineFunction("setScissor", _SE(js_cc_render_SceneVisitor_setScissor)); + cls->defineFunction("bindPipelineState", _SE(js_cc_render_SceneVisitor_bindPipelineState)); + cls->defineFunction("bindInputAssembler", _SE(js_cc_render_SceneVisitor_bindInputAssembler)); + cls->defineFunction("draw", _SE(js_cc_render_SceneVisitor_draw)); + + + + + cls->defineFinalizeFunction(_SE(js_delete_cc_render_SceneVisitor)); + + + cls->install(); + JSBClassType::registerClass(cls); + + __jsb_cc_render_SceneVisitor_proto = cls->getProto(); + __jsb_cc_render_SceneVisitor_class = cls; + se::ScriptEngine::getInstance()->clearException(); + return true; +} + + +se::Class* __jsb_cc_render_SceneTask_class = nullptr; +se::Object* __jsb_cc_render_SceneTask_proto = nullptr; +SE_DECLARE_FINALIZE_FUNC(js_delete_cc_render_SceneTask) + +static bool js_delete_cc_render_SceneTask(se::State& s) +{ + return true; +} +SE_BIND_FINALIZE_FUNC(js_delete_cc_render_SceneTask) + +static bool js_cc_render_SceneTask_start(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + cc::render::SceneTask *arg1 = (cc::render::SceneTask *) NULL ; + + if(argc != 0) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0); + return false; + } + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + (arg1)->start(); + + + return true; +} +SE_BIND_FUNC(js_cc_render_SceneTask_start) + +static bool js_cc_render_SceneTask_join(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + cc::render::SceneTask *arg1 = (cc::render::SceneTask *) NULL ; + + if(argc != 0) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0); + return false; + } + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + (arg1)->join(); + + + return true; +} +SE_BIND_FUNC(js_cc_render_SceneTask_join) + +static bool js_cc_render_SceneTask_submit(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + cc::render::SceneTask *arg1 = (cc::render::SceneTask *) NULL ; + + if(argc != 0) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0); + return false; + } + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + (arg1)->submit(); + + + return true; +} +SE_BIND_FUNC(js_cc_render_SceneTask_submit) -static bool js_cc_render_CopyPassBuilder_addPair(se::State& s) +static bool js_cc_render_SceneTask_taskType_get(se::State& s) { CC_UNUSED bool ok = true; - const auto& args = s.args(); - size_t argc = args.size(); - cc::render::CopyPassBuilder *arg1 = (cc::render::CopyPassBuilder *) NULL ; - CopyPair *arg2 = 0 ; - CopyPair temp2 ; + cc::render::SceneTask *arg1 = (cc::render::SceneTask *) NULL ; + cc::render::TaskType result; - if(argc != 1) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1); - return false; - } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; + result = cc_render_SceneTask_taskType_get(arg1); - ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + ok &= nativevalue_to_se(result, s.rval(), s.thisObject() /*ctx*/); SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg2 = &temp2; + SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); - (arg1)->addPair((CopyPair const &)*arg2); return true; } -SE_BIND_FUNC(js_cc_render_CopyPassBuilder_addPair) - -static bool js_delete_cc_render_CopyPassBuilder(se::State& s) -{ - return true; -} -SE_BIND_FINALIZE_FUNC(js_delete_cc_render_CopyPassBuilder) +SE_BIND_PROP_GET(js_cc_render_SceneTask_taskType_get) -bool js_register_cc_render_CopyPassBuilder(se::Object* obj) { - auto* cls = se::Class::create("CopyPassBuilder", obj, __jsb_cc_render_RenderNode_proto, nullptr); +bool js_register_cc_render_SceneTask(se::Object* obj) { + auto* cls = se::Class::create("SceneTask", obj, nullptr, nullptr); cls->defineStaticProperty("__isJSB", se::Value(true), se::PropertyAttribute::READ_ONLY | se::PropertyAttribute::DONT_ENUM | se::PropertyAttribute::DONT_DELETE); + cls->defineProperty("taskType", _SE(js_cc_render_SceneTask_taskType_get), nullptr); - cls->defineFunction("addPair", _SE(js_cc_render_CopyPassBuilder_addPair)); + cls->defineFunction("start", _SE(js_cc_render_SceneTask_start)); + cls->defineFunction("join", _SE(js_cc_render_SceneTask_join)); + cls->defineFunction("submit", _SE(js_cc_render_SceneTask_submit)); - cls->defineFinalizeFunction(_SE(js_delete_cc_render_CopyPassBuilder)); + cls->defineFinalizeFunction(_SE(js_delete_cc_render_SceneTask)); cls->install(); - JSBClassType::registerClass(cls); + JSBClassType::registerClass(cls); - __jsb_cc_render_CopyPassBuilder_proto = cls->getProto(); - __jsb_cc_render_CopyPassBuilder_class = cls; + __jsb_cc_render_SceneTask_proto = cls->getProto(); + __jsb_cc_render_SceneTask_class = cls; se::ScriptEngine::getInstance()->clearException(); return true; } -se::Class* __jsb_cc_render_SceneVisitor_class = nullptr; -se::Object* __jsb_cc_render_SceneVisitor_proto = nullptr; -SE_DECLARE_FINALIZE_FUNC(js_delete_cc_render_SceneVisitor) +se::Class* __jsb_cc_render_SceneTransversal_class = nullptr; +se::Object* __jsb_cc_render_SceneTransversal_proto = nullptr; +SE_DECLARE_FINALIZE_FUNC(js_delete_cc_render_SceneTransversal) -static bool js_delete_cc_render_SceneVisitor(se::State& s) +static bool js_delete_cc_render_SceneTransversal(se::State& s) { return true; } -SE_BIND_FINALIZE_FUNC(js_delete_cc_render_SceneVisitor) +SE_BIND_FINALIZE_FUNC(js_delete_cc_render_SceneTransversal) -static bool js_cc_render_SceneVisitor_setViewport(se::State& s) +static bool js_cc_render_SceneTransversal_transverse(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - cc::render::SceneVisitor *arg1 = (cc::render::SceneVisitor *) NULL ; - gfx::Viewport *arg2 = 0 ; - gfx::Viewport temp2 ; + cc::render::SceneTransversal *arg1 = (cc::render::SceneTransversal *) NULL ; + cc::render::SceneVisitor *arg2 = (cc::render::SceneVisitor *) NULL ; + cc::render::SceneTask *result = 0 ; if(argc != 1) { SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1); return false; } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg2 = &temp2; + ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + result = (cc::render::SceneTask *)((cc::render::SceneTransversal const *)arg1)->transverse(arg2); - (arg1)->setViewport((gfx::Viewport const &)*arg2); + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); return true; } -SE_BIND_FUNC(js_cc_render_SceneVisitor_setViewport) +SE_BIND_FUNC(js_cc_render_SceneTransversal_transverse) -static bool js_cc_render_SceneVisitor_setScissor(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - size_t argc = args.size(); - cc::render::SceneVisitor *arg1 = (cc::render::SceneVisitor *) NULL ; - gfx::Rect *arg2 = 0 ; - gfx::Rect temp2 ; +bool js_register_cc_render_SceneTransversal(se::Object* obj) { + auto* cls = se::Class::create("SceneTransversal", obj, nullptr, nullptr); - if(argc != 1) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1); - return false; - } - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; + cls->defineStaticProperty("__isJSB", se::Value(true), se::PropertyAttribute::READ_ONLY | se::PropertyAttribute::DONT_ENUM | se::PropertyAttribute::DONT_DELETE); + + cls->defineFunction("transverse", _SE(js_cc_render_SceneTransversal_transverse)); - ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg2 = &temp2; - (arg1)->setScissor((gfx::Rect const &)*arg2); + cls->defineFinalizeFunction(_SE(js_delete_cc_render_SceneTransversal)); + + + cls->install(); + JSBClassType::registerClass(cls); + + __jsb_cc_render_SceneTransversal_proto = cls->getProto(); + __jsb_cc_render_SceneTransversal_class = cls; + se::ScriptEngine::getInstance()->clearException(); return true; } -SE_BIND_FUNC(js_cc_render_SceneVisitor_setScissor) -static bool js_cc_render_SceneVisitor_bindPipelineState(se::State& s) + +se::Class* __jsb_cc_render_BasicPipeline_class = nullptr; +se::Object* __jsb_cc_render_BasicPipeline_proto = nullptr; +SE_DECLARE_FINALIZE_FUNC(js_delete_cc_render_BasicPipeline) + +static bool js_cc_render_BasicPipeline_beginSetup(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - cc::render::SceneVisitor *arg1 = (cc::render::SceneVisitor *) NULL ; - gfx::PipelineState *arg2 = (gfx::PipelineState *) NULL ; + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; - if(argc != 1) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1); + if(argc != 0) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0); return false; } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - - ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - (arg1)->bindPipelineState(arg2); + (arg1)->beginSetup(); return true; } -SE_BIND_FUNC(js_cc_render_SceneVisitor_bindPipelineState) +SE_BIND_FUNC(js_cc_render_BasicPipeline_beginSetup) -static bool js_cc_render_SceneVisitor_bindInputAssembler(se::State& s) +static bool js_cc_render_BasicPipeline_endSetup(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - cc::render::SceneVisitor *arg1 = (cc::render::SceneVisitor *) NULL ; - gfx::InputAssembler *arg2 = (gfx::InputAssembler *) NULL ; + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; - if(argc != 1) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1); + if(argc != 0) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0); return false; } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - - ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - (arg1)->bindInputAssembler(arg2); + (arg1)->endSetup(); return true; } -SE_BIND_FUNC(js_cc_render_SceneVisitor_bindInputAssembler) +SE_BIND_FUNC(js_cc_render_BasicPipeline_endSetup) -static bool js_cc_render_SceneVisitor_draw(se::State& s) +static bool js_cc_render_BasicPipeline_containsResource(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - cc::render::SceneVisitor *arg1 = (cc::render::SceneVisitor *) NULL ; - gfx::DrawInfo *arg2 = 0 ; - gfx::DrawInfo temp2 ; + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; + ccstd::string *arg2 = 0 ; + ccstd::string temp2 ; + bool result; if(argc != 1) { SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1); return false; } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); arg2 = &temp2; - (arg1)->draw((gfx::DrawInfo const &)*arg2); + result = (bool)((cc::render::BasicPipeline const *)arg1)->containsResource((ccstd::string const &)*arg2); + + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); return true; } -SE_BIND_FUNC(js_cc_render_SceneVisitor_draw) +SE_BIND_FUNC(js_cc_render_BasicPipeline_containsResource) -static bool js_cc_render_SceneVisitor_pipelineSceneData_get(se::State& s) +static bool js_cc_render_BasicPipeline_addRenderTexture(se::State& s) { CC_UNUSED bool ok = true; - cc::render::SceneVisitor *arg1 = (cc::render::SceneVisitor *) NULL ; - cc::pipeline::PipelineSceneData *result = 0 ; + const auto& args = s.args(); + size_t argc = args.size(); + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; + ccstd::string *arg2 = 0 ; + gfx::Format arg3 ; + uint32_t arg4 ; + uint32_t arg5 ; + cc::scene::RenderWindow *arg6 = (cc::scene::RenderWindow *) NULL ; + ccstd::string temp2 ; + uint32_t result; - arg1 = SE_THIS_OBJECT(s); + if(argc != 5) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 5); + return false; + } + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - result = (cc::pipeline::PipelineSceneData *)cc_render_SceneVisitor_pipelineSceneData_get(arg1); - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); + arg2 = &temp2; - return true; -} -SE_BIND_PROP_GET(js_cc_render_SceneVisitor_pipelineSceneData_get) - -bool js_register_cc_render_SceneVisitor(se::Object* obj) { - auto* cls = se::Class::create("SceneVisitor", obj, nullptr, nullptr); + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); - cls->defineStaticProperty("__isJSB", se::Value(true), se::PropertyAttribute::READ_ONLY | se::PropertyAttribute::DONT_ENUM | se::PropertyAttribute::DONT_DELETE); - cls->defineProperty("pipelineSceneData", _SE(js_cc_render_SceneVisitor_pipelineSceneData_get), nullptr); - cls->defineFunction("setViewport", _SE(js_cc_render_SceneVisitor_setViewport)); - cls->defineFunction("setScissor", _SE(js_cc_render_SceneVisitor_setScissor)); - cls->defineFunction("bindPipelineState", _SE(js_cc_render_SceneVisitor_bindPipelineState)); - cls->defineFunction("bindInputAssembler", _SE(js_cc_render_SceneVisitor_bindInputAssembler)); - cls->defineFunction("draw", _SE(js_cc_render_SceneVisitor_draw)); + ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); - cls->defineFinalizeFunction(_SE(js_delete_cc_render_SceneVisitor)); + ok &= sevalue_to_native(args[4], &arg6, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + result = (arg1)->addRenderTexture((ccstd::string const &)*arg2,arg3,arg4,arg5,arg6); + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); - cls->install(); - JSBClassType::registerClass(cls); - __jsb_cc_render_SceneVisitor_proto = cls->getProto(); - __jsb_cc_render_SceneVisitor_class = cls; - se::ScriptEngine::getInstance()->clearException(); - return true; -} - - -se::Class* __jsb_cc_render_SceneTask_class = nullptr; -se::Object* __jsb_cc_render_SceneTask_proto = nullptr; -SE_DECLARE_FINALIZE_FUNC(js_delete_cc_render_SceneTask) - -static bool js_delete_cc_render_SceneTask(se::State& s) -{ return true; } -SE_BIND_FINALIZE_FUNC(js_delete_cc_render_SceneTask) +SE_BIND_FUNC(js_cc_render_BasicPipeline_addRenderTexture) -static bool js_cc_render_SceneTask_start(se::State& s) +static bool js_cc_render_BasicPipeline_addRenderWindow(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - cc::render::SceneTask *arg1 = (cc::render::SceneTask *) NULL ; + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; + ccstd::string *arg2 = 0 ; + gfx::Format arg3 ; + uint32_t arg4 ; + uint32_t arg5 ; + cc::scene::RenderWindow *arg6 = (cc::scene::RenderWindow *) NULL ; + ccstd::string temp2 ; + uint32_t result; - if(argc != 0) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0); + if(argc != 5) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 5); return false; } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - (arg1)->start(); + + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[4], &arg6, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + result = (arg1)->addRenderWindow((ccstd::string const &)*arg2,arg3,arg4,arg5,arg6); + + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); return true; } -SE_BIND_FUNC(js_cc_render_SceneTask_start) +SE_BIND_FUNC(js_cc_render_BasicPipeline_addRenderWindow) -static bool js_cc_render_SceneTask_join(se::State& s) +static bool js_cc_render_BasicPipeline_updateRenderWindow(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - cc::render::SceneTask *arg1 = (cc::render::SceneTask *) NULL ; + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; + ccstd::string *arg2 = 0 ; + cc::scene::RenderWindow *arg3 = (cc::scene::RenderWindow *) NULL ; + ccstd::string temp2 ; - if(argc != 0) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0); + if(argc != 2) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 2); return false; } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - (arg1)->join(); + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; - return true; -} -SE_BIND_FUNC(js_cc_render_SceneTask_join) - -static bool js_cc_render_SceneTask_submit(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - size_t argc = args.size(); - cc::render::SceneTask *arg1 = (cc::render::SceneTask *) NULL ; - if(argc != 0) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0); - return false; - } - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - (arg1)->submit(); + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + (arg1)->updateRenderWindow((ccstd::string const &)*arg2,arg3); return true; } -SE_BIND_FUNC(js_cc_render_SceneTask_submit) +SE_BIND_FUNC(js_cc_render_BasicPipeline_updateRenderWindow) -static bool js_cc_render_SceneTask_taskType_get(se::State& s) +static bool js_cc_render_BasicPipeline_addRenderTarget__SWIG_0(se::State& s) { CC_UNUSED bool ok = true; - cc::render::SceneTask *arg1 = (cc::render::SceneTask *) NULL ; - cc::render::TaskType result; + const auto& args = s.args(); + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; + ccstd::string *arg2 = 0 ; + gfx::Format arg3 ; + uint32_t arg4 ; + uint32_t arg5 ; + ResourceResidency arg6 ; + ccstd::string temp2 ; + uint32_t result; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - result = cc_render_SceneTask_taskType_get(arg1); - ok &= nativevalue_to_se(result, s.rval(), s.thisObject() /*ctx*/); + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); + arg2 = &temp2; + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); - return true; -} -SE_BIND_PROP_GET(js_cc_render_SceneTask_taskType_get) - -bool js_register_cc_render_SceneTask(se::Object* obj) { - auto* cls = se::Class::create("SceneTask", obj, nullptr, nullptr); - cls->defineStaticProperty("__isJSB", se::Value(true), se::PropertyAttribute::READ_ONLY | se::PropertyAttribute::DONT_ENUM | se::PropertyAttribute::DONT_DELETE); - cls->defineProperty("taskType", _SE(js_cc_render_SceneTask_taskType_get), nullptr); + ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); - cls->defineFunction("start", _SE(js_cc_render_SceneTask_start)); - cls->defineFunction("join", _SE(js_cc_render_SceneTask_join)); - cls->defineFunction("submit", _SE(js_cc_render_SceneTask_submit)); + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + ok &= sevalue_to_native(args[4], &arg6, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); - cls->defineFinalizeFunction(_SE(js_delete_cc_render_SceneTask)); + result = (arg1)->addRenderTarget((ccstd::string const &)*arg2,arg3,arg4,arg5,arg6); + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); - cls->install(); - JSBClassType::registerClass(cls); - __jsb_cc_render_SceneTask_proto = cls->getProto(); - __jsb_cc_render_SceneTask_class = cls; - se::ScriptEngine::getInstance()->clearException(); return true; } - -se::Class* __jsb_cc_render_SceneTransversal_class = nullptr; -se::Object* __jsb_cc_render_SceneTransversal_proto = nullptr; -SE_DECLARE_FINALIZE_FUNC(js_delete_cc_render_SceneTransversal) - -static bool js_delete_cc_render_SceneTransversal(se::State& s) -{ - return true; -} -SE_BIND_FINALIZE_FUNC(js_delete_cc_render_SceneTransversal) - -static bool js_cc_render_SceneTransversal_transverse(se::State& s) +static bool js_cc_render_BasicPipeline_addDepthStencil__SWIG_0(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - size_t argc = args.size(); - cc::render::SceneTransversal *arg1 = (cc::render::SceneTransversal *) NULL ; - cc::render::SceneVisitor *arg2 = (cc::render::SceneVisitor *) NULL ; - cc::render::SceneTask *result = 0 ; + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; + ccstd::string *arg2 = 0 ; + gfx::Format arg3 ; + uint32_t arg4 ; + uint32_t arg5 ; + ResourceResidency arg6 ; + ccstd::string temp2 ; + uint32_t result; - if(argc != 1) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1); - return false; - } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - result = (cc::render::SceneTask *)((cc::render::SceneTransversal const *)arg1)->transverse(arg2); - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + + ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); + + + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[4], &arg6, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + result = (arg1)->addDepthStencil((ccstd::string const &)*arg2,arg3,arg4,arg5,arg6); + + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); return true; } -SE_BIND_FUNC(js_cc_render_SceneTransversal_transverse) -bool js_register_cc_render_SceneTransversal(se::Object* obj) { - auto* cls = se::Class::create("SceneTransversal", obj, nullptr, nullptr); +static bool js_cc_render_BasicPipeline_updateRenderTarget__SWIG_0(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; + ccstd::string *arg2 = 0 ; + uint32_t arg3 ; + uint32_t arg4 ; + gfx::Format arg5 ; + ccstd::string temp2 ; - cls->defineStaticProperty("__isJSB", se::Value(true), se::PropertyAttribute::READ_ONLY | se::PropertyAttribute::DONT_ENUM | se::PropertyAttribute::DONT_DELETE); + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; - cls->defineFunction("transverse", _SE(js_cc_render_SceneTransversal_transverse)); + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); - cls->defineFinalizeFunction(_SE(js_delete_cc_render_SceneTransversal)); + ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); - cls->install(); - JSBClassType::registerClass(cls); + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + (arg1)->updateRenderTarget((ccstd::string const &)*arg2,arg3,arg4,arg5); + - __jsb_cc_render_SceneTransversal_proto = cls->getProto(); - __jsb_cc_render_SceneTransversal_class = cls; - se::ScriptEngine::getInstance()->clearException(); return true; } - -se::Class* __jsb_cc_render_Pipeline_class = nullptr; -se::Object* __jsb_cc_render_Pipeline_proto = nullptr; -SE_DECLARE_FINALIZE_FUNC(js_delete_cc_render_Pipeline) - -static bool js_cc_render_Pipeline_beginSetup(se::State& s) +static bool js_cc_render_BasicPipeline_updateDepthStencil__SWIG_0(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - size_t argc = args.size(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; + ccstd::string *arg2 = 0 ; + uint32_t arg3 ; + uint32_t arg4 ; + gfx::Format arg5 ; + ccstd::string temp2 ; - if(argc != 0) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0); - return false; - } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - (arg1)->beginSetup(); + + ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg2 = &temp2; + + + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + (arg1)->updateDepthStencil((ccstd::string const &)*arg2,arg3,arg4,arg5); return true; } -SE_BIND_FUNC(js_cc_render_Pipeline_beginSetup) -static bool js_cc_render_Pipeline_endSetup(se::State& s) +static bool js_cc_render_BasicPipeline_beginFrame(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; if(argc != 0) { SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0); return false; } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - (arg1)->endSetup(); + (arg1)->beginFrame(); return true; } -SE_BIND_FUNC(js_cc_render_Pipeline_endSetup) +SE_BIND_FUNC(js_cc_render_BasicPipeline_beginFrame) -static bool js_cc_render_Pipeline_containsResource(se::State& s) +static bool js_cc_render_BasicPipeline_endFrame(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; - ccstd::string *arg2 = 0 ; - ccstd::string temp2 ; - bool result; + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; - if(argc != 1) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1); + if(argc != 0) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0); return false; } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - - ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg2 = &temp2; - - result = (bool)((cc::render::Pipeline const *)arg1)->containsResource((ccstd::string const &)*arg2); - - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + (arg1)->endFrame(); return true; } -SE_BIND_FUNC(js_cc_render_Pipeline_containsResource) +SE_BIND_FUNC(js_cc_render_BasicPipeline_endFrame) -static bool js_cc_render_Pipeline_addRenderTexture(se::State& s) +static bool js_cc_render_BasicPipeline_addRasterPass__SWIG_0(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - size_t argc = args.size(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; - ccstd::string *arg2 = 0 ; - gfx::Format arg3 ; - uint32_t arg4 ; - uint32_t arg5 ; - cc::scene::RenderWindow *arg6 = (cc::scene::RenderWindow *) NULL ; - ccstd::string temp2 ; - uint32_t result; + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; + uint32_t arg2 ; + uint32_t arg3 ; + ccstd::string *arg4 = 0 ; + ccstd::string temp4 ; + cc::render::BasicRenderPassBuilder *result = 0 ; - if(argc != 5) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 5); - return false; - } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg2 = &temp2; ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - - ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg4 = &temp4; + result = (cc::render::BasicRenderPassBuilder *)(arg1)->addRasterPass(arg2,arg3,(ccstd::string const &)*arg4); - ok &= sevalue_to_native(args[4], &arg6, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - result = (arg1)->addRenderTexture((ccstd::string const &)*arg2,arg3,arg4,arg5,arg6); - - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); return true; } -SE_BIND_FUNC(js_cc_render_Pipeline_addRenderTexture) -static bool js_cc_render_Pipeline_addRenderWindow(se::State& s) +static bool js_cc_render_BasicPipeline_addMovePass(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; - ccstd::string *arg2 = 0 ; - gfx::Format arg3 ; - uint32_t arg4 ; - uint32_t arg5 ; - cc::scene::RenderWindow *arg6 = (cc::scene::RenderWindow *) NULL ; - ccstd::string temp2 ; - uint32_t result; + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; + cc::render::MovePassBuilder *result = 0 ; - if(argc != 5) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 5); + if(argc != 0) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0); return false; } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; + result = (cc::render::MovePassBuilder *)(arg1)->addMovePass(); - ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg2 = &temp2; - - - ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); + SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); - ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); + return true; +} +SE_BIND_FUNC(js_cc_render_BasicPipeline_addMovePass) + +static bool js_cc_render_BasicPipeline_addCopyPass(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; + cc::render::CopyPassBuilder *result = 0 ; + if(argc != 0) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0); + return false; + } + arg1 = SE_THIS_OBJECT(s); + if (nullptr == arg1) return true; + result = (cc::render::CopyPassBuilder *)(arg1)->addCopyPass(); - ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - - - ok &= sevalue_to_native(args[4], &arg6, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - result = (arg1)->addRenderWindow((ccstd::string const &)*arg2,arg3,arg4,arg5,arg6); - - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); return true; } -SE_BIND_FUNC(js_cc_render_Pipeline_addRenderWindow) +SE_BIND_FUNC(js_cc_render_BasicPipeline_addCopyPass) -static bool js_cc_render_Pipeline_updateRenderWindow(se::State& s) +static bool js_cc_render_BasicPipeline_getDescriptorSetLayout(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; ccstd::string *arg2 = 0 ; - cc::scene::RenderWindow *arg3 = (cc::scene::RenderWindow *) NULL ; + UpdateFrequency arg3 ; ccstd::string temp2 ; + gfx::DescriptorSetLayout *result = 0 ; if(argc != 2) { SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 2); return false; } - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -5131,26 +6356,31 @@ static bool js_cc_render_Pipeline_updateRenderWindow(se::State& s) ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - (arg1)->updateRenderWindow((ccstd::string const &)*arg2,arg3); + + result = (gfx::DescriptorSetLayout *)(arg1)->getDescriptorSetLayout((ccstd::string const &)*arg2,arg3); + + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); return true; } -SE_BIND_FUNC(js_cc_render_Pipeline_updateRenderWindow) +SE_BIND_FUNC(js_cc_render_BasicPipeline_getDescriptorSetLayout) -static bool js_cc_render_Pipeline_addStorageBuffer__SWIG_0(se::State& s) +static bool js_cc_render_BasicPipeline_addRenderTarget__SWIG_1(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; ccstd::string *arg2 = 0 ; gfx::Format arg3 ; uint32_t arg4 ; - ResourceResidency arg5 ; + uint32_t arg5 ; ccstd::string temp2 ; uint32_t result; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -5167,9 +6397,9 @@ static bool js_cc_render_Pipeline_addStorageBuffer__SWIG_0(se::State& s) ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); + SE_PRECONDITION2(ok, false, "Error processing arguments"); - result = (arg1)->addStorageBuffer((ccstd::string const &)*arg2,arg3,arg4,arg5); + result = (arg1)->addRenderTarget((ccstd::string const &)*arg2,arg3,arg4,arg5); ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); @@ -5177,20 +6407,43 @@ static bool js_cc_render_Pipeline_addStorageBuffer__SWIG_0(se::State& s) return true; } -static bool js_cc_render_Pipeline_addRenderTarget__SWIG_0(se::State& s) +static bool js_cc_render_BasicPipeline_addRenderTarget(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; + size_t argc = args.size(); + + + if (argc == 5) { + ok = js_cc_render_BasicPipeline_addRenderTarget__SWIG_0(s); + if (ok) { + return true; + } + } + if (argc == 4) { + ok = js_cc_render_BasicPipeline_addRenderTarget__SWIG_1(s); + if (ok) { + return true; + } + } + SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); + return false; +} +SE_BIND_FUNC(js_cc_render_BasicPipeline_addRenderTarget) + +static bool js_cc_render_BasicPipeline_addDepthStencil__SWIG_1(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; ccstd::string *arg2 = 0 ; gfx::Format arg3 ; uint32_t arg4 ; uint32_t arg5 ; - ResourceResidency arg6 ; ccstd::string temp2 ; uint32_t result; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -5209,11 +6462,7 @@ static bool js_cc_render_Pipeline_addRenderTarget__SWIG_0(se::State& s) ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - - ok &= sevalue_to_native(args[4], &arg6, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - result = (arg1)->addRenderTarget((ccstd::string const &)*arg2,arg3,arg4,arg5,arg6); + result = (arg1)->addDepthStencil((ccstd::string const &)*arg2,arg3,arg4,arg5); ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); @@ -5221,20 +6470,41 @@ static bool js_cc_render_Pipeline_addRenderTarget__SWIG_0(se::State& s) return true; } -static bool js_cc_render_Pipeline_addDepthStencil__SWIG_0(se::State& s) +static bool js_cc_render_BasicPipeline_addDepthStencil(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; + size_t argc = args.size(); + + + if (argc == 5) { + ok = js_cc_render_BasicPipeline_addDepthStencil__SWIG_0(s); + if (ok) { + return true; + } + } + if (argc == 4) { + ok = js_cc_render_BasicPipeline_addDepthStencil__SWIG_1(s); + if (ok) { + return true; + } + } + SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); + return false; +} +SE_BIND_FUNC(js_cc_render_BasicPipeline_addDepthStencil) + +static bool js_cc_render_BasicPipeline_updateRenderTarget__SWIG_1(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; ccstd::string *arg2 = 0 ; - gfx::Format arg3 ; + uint32_t arg3 ; uint32_t arg4 ; - uint32_t arg5 ; - ResourceResidency arg6 ; ccstd::string temp2 ; - uint32_t result; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -5243,42 +6513,53 @@ static bool js_cc_render_Pipeline_addDepthStencil__SWIG_0(se::State& s) ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - - ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); + (arg1)->updateRenderTarget((ccstd::string const &)*arg2,arg3,arg4); - ok &= sevalue_to_native(args[4], &arg6, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - result = (arg1)->addDepthStencil((ccstd::string const &)*arg2,arg3,arg4,arg5,arg6); - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + return true; +} + +static bool js_cc_render_BasicPipeline_updateRenderTarget(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); - return true; + if (argc == 4) { + ok = js_cc_render_BasicPipeline_updateRenderTarget__SWIG_0(s); + if (ok) { + return true; + } + } + if (argc == 3) { + ok = js_cc_render_BasicPipeline_updateRenderTarget__SWIG_1(s); + if (ok) { + return true; + } + } + SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); + return false; } +SE_BIND_FUNC(js_cc_render_BasicPipeline_updateRenderTarget) -static bool js_cc_render_Pipeline_addStorageTexture__SWIG_0(se::State& s) +static bool js_cc_render_BasicPipeline_updateDepthStencil__SWIG_1(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; ccstd::string *arg2 = 0 ; - gfx::Format arg3 ; + uint32_t arg3 ; uint32_t arg4 ; - uint32_t arg5 ; - ResourceResidency arg6 ; ccstd::string temp2 ; - uint32_t result; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); @@ -5287,129 +6568,176 @@ static bool js_cc_render_Pipeline_addStorageTexture__SWIG_0(se::State& s) ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - - ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); + (arg1)->updateDepthStencil((ccstd::string const &)*arg2,arg3,arg4); - ok &= sevalue_to_native(args[4], &arg6, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - result = (arg1)->addStorageTexture((ccstd::string const &)*arg2,arg3,arg4,arg5,arg6); - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + return true; +} + +static bool js_cc_render_BasicPipeline_updateDepthStencil(se::State& s) +{ + CC_UNUSED bool ok = true; + const auto& args = s.args(); + size_t argc = args.size(); - return true; + if (argc == 4) { + ok = js_cc_render_BasicPipeline_updateDepthStencil__SWIG_0(s); + if (ok) { + return true; + } + } + if (argc == 3) { + ok = js_cc_render_BasicPipeline_updateDepthStencil__SWIG_1(s); + if (ok) { + return true; + } + } + SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); + return false; } +SE_BIND_FUNC(js_cc_render_BasicPipeline_updateDepthStencil) -static bool js_cc_render_Pipeline_addShadingRateTexture__SWIG_0(se::State& s) +static bool js_cc_render_BasicPipeline_addRasterPass__SWIG_1(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; - ccstd::string *arg2 = 0 ; + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; + uint32_t arg2 ; uint32_t arg3 ; - uint32_t arg4 ; - ResourceResidency arg5 ; - ccstd::string temp2 ; - uint32_t result; + cc::render::BasicRenderPassBuilder *result = 0 ; - arg1 = SE_THIS_OBJECT(s); + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; - ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg2 = &temp2; ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); + result = (cc::render::BasicRenderPassBuilder *)(arg1)->addRasterPass(arg2,arg3); - ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - - - ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - result = (arg1)->addShadingRateTexture((ccstd::string const &)*arg2,arg3,arg4,arg5); - - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); return true; } -static bool js_cc_render_Pipeline_addCustomBuffer(se::State& s) +static bool js_cc_render_BasicPipeline_addRasterPass(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; - ccstd::string *arg2 = 0 ; - gfx::BufferInfo *arg3 = 0 ; - std::string *arg4 = 0 ; - ccstd::string temp2 ; - gfx::BufferInfo temp3 ; - std::string temp4 ; - uint32_t result; - if(argc != 3) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 3); - return false; - } - arg1 = SE_THIS_OBJECT(s); + + if (argc == 3) { + ok = js_cc_render_BasicPipeline_addRasterPass__SWIG_0(s); + if (ok) { + return true; + } + } + if (argc == 2) { + ok = js_cc_render_BasicPipeline_addRasterPass__SWIG_1(s); + if (ok) { + return true; + } + } + SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); + return false; +} +SE_BIND_FUNC(js_cc_render_BasicPipeline_addRasterPass) + +static bool js_cc_render_BasicPipeline_pipelineType_get(se::State& s) +{ + CC_UNUSED bool ok = true; + cc::render::BasicPipeline *arg1 = (cc::render::BasicPipeline *) NULL ; + cc::render::PipelineType result; + + arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; + result = (cc::render::PipelineType)cc_render_BasicPipeline_pipelineType_get(arg1); - ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); + ok &= nativevalue_to_se(result, s.rval(), s.thisObject() /*ctx*/); SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg2 = &temp2; + SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); - ok &= sevalue_to_native(args[1], &temp3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg3 = &temp3; + return true; +} +SE_BIND_PROP_GET(js_cc_render_BasicPipeline_pipelineType_get) + +static bool js_delete_cc_render_BasicPipeline(se::State& s) +{ + return true; +} +SE_BIND_FINALIZE_FUNC(js_delete_cc_render_BasicPipeline) + +bool js_register_cc_render_BasicPipeline(se::Object* obj) { + auto* cls = se::Class::create("BasicPipeline", obj, __jsb_cc_render_PipelineRuntime_proto, nullptr); + + cls->defineStaticProperty("__isJSB", se::Value(true), se::PropertyAttribute::READ_ONLY | se::PropertyAttribute::DONT_ENUM | se::PropertyAttribute::DONT_DELETE); + cls->defineProperty("pipelineType", _SE(js_cc_render_BasicPipeline_pipelineType_get), nullptr); + + cls->defineFunction("beginSetup", _SE(js_cc_render_BasicPipeline_beginSetup)); + cls->defineFunction("endSetup", _SE(js_cc_render_BasicPipeline_endSetup)); + cls->defineFunction("containsResource", _SE(js_cc_render_BasicPipeline_containsResource)); + cls->defineFunction("addRenderTexture", _SE(js_cc_render_BasicPipeline_addRenderTexture)); + cls->defineFunction("addRenderWindow", _SE(js_cc_render_BasicPipeline_addRenderWindow)); + cls->defineFunction("updateRenderWindow", _SE(js_cc_render_BasicPipeline_updateRenderWindow)); + cls->defineFunction("beginFrame", _SE(js_cc_render_BasicPipeline_beginFrame)); + cls->defineFunction("endFrame", _SE(js_cc_render_BasicPipeline_endFrame)); + cls->defineFunction("addMovePass", _SE(js_cc_render_BasicPipeline_addMovePass)); + cls->defineFunction("addCopyPass", _SE(js_cc_render_BasicPipeline_addCopyPass)); + cls->defineFunction("getDescriptorSetLayout", _SE(js_cc_render_BasicPipeline_getDescriptorSetLayout)); + cls->defineFunction("addRenderTarget", _SE(js_cc_render_BasicPipeline_addRenderTarget)); + cls->defineFunction("addDepthStencil", _SE(js_cc_render_BasicPipeline_addDepthStencil)); + cls->defineFunction("updateRenderTarget", _SE(js_cc_render_BasicPipeline_updateRenderTarget)); + cls->defineFunction("updateDepthStencil", _SE(js_cc_render_BasicPipeline_updateDepthStencil)); + cls->defineFunction("addRasterPass", _SE(js_cc_render_BasicPipeline_addRasterPass)); - ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg4 = &temp4; - result = (arg1)->addCustomBuffer((ccstd::string const &)*arg2,(gfx::BufferInfo const &)*arg3,(std::string const &)*arg4); - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); + cls->defineFinalizeFunction(_SE(js_delete_cc_render_BasicPipeline)); + + cls->install(); + JSBClassType::registerClass(cls); + + __jsb_cc_render_BasicPipeline_proto = cls->getProto(); + __jsb_cc_render_BasicPipeline_class = cls; + se::ScriptEngine::getInstance()->clearException(); return true; } -SE_BIND_FUNC(js_cc_render_Pipeline_addCustomBuffer) -static bool js_cc_render_Pipeline_addCustomTexture(se::State& s) + +se::Class* __jsb_cc_render_Pipeline_class = nullptr; +se::Object* __jsb_cc_render_Pipeline_proto = nullptr; +SE_DECLARE_FINALIZE_FUNC(js_delete_cc_render_Pipeline) + +static bool js_cc_render_Pipeline_addStorageBuffer__SWIG_0(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); - size_t argc = args.size(); cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; ccstd::string *arg2 = 0 ; - gfx::TextureInfo *arg3 = 0 ; - std::string *arg4 = 0 ; + gfx::Format arg3 ; + uint32_t arg4 ; + ResourceResidency arg5 ; ccstd::string temp2 ; - gfx::TextureInfo temp3 ; - std::string temp4 ; uint32_t result; - if(argc != 3) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 3); - return false; - } arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; @@ -5418,33 +6746,37 @@ static bool js_cc_render_Pipeline_addCustomTexture(se::State& s) arg2 = &temp2; - ok &= sevalue_to_native(args[1], &temp3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg3 = &temp3; + ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); - ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); + ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg4 = &temp4; - result = (arg1)->addCustomTexture((ccstd::string const &)*arg2,(gfx::TextureInfo const &)*arg3,(std::string const &)*arg4); + + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + result = (arg1)->addStorageBuffer((ccstd::string const &)*arg2,arg3,arg4,arg5); ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); return true; } -SE_BIND_FUNC(js_cc_render_Pipeline_addCustomTexture) -static bool js_cc_render_Pipeline_updateStorageBuffer__SWIG_0(se::State& s) +static bool js_cc_render_Pipeline_addStorageTexture__SWIG_0(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; ccstd::string *arg2 = 0 ; - uint32_t arg3 ; - gfx::Format arg4 ; + gfx::Format arg3 ; + uint32_t arg4 ; + uint32_t arg5 ; + ResourceResidency arg6 ; ccstd::string temp2 ; + uint32_t result; arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; @@ -5455,19 +6787,29 @@ static bool js_cc_render_Pipeline_updateStorageBuffer__SWIG_0(se::State& s) ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); + SE_PRECONDITION2(ok, false, "Error processing arguments"); ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + + + ok &= sevalue_to_native(args[4], &arg6, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - (arg1)->updateStorageBuffer((ccstd::string const &)*arg2,arg3,arg4); + result = (arg1)->addStorageTexture((ccstd::string const &)*arg2,arg3,arg4,arg5,arg6); + + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); return true; } -static bool js_cc_render_Pipeline_updateRenderTarget__SWIG_0(se::State& s) +static bool js_cc_render_Pipeline_addShadingRateTexture__SWIG_0(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); @@ -5475,8 +6817,9 @@ static bool js_cc_render_Pipeline_updateRenderTarget__SWIG_0(se::State& s) ccstd::string *arg2 = 0 ; uint32_t arg3 ; uint32_t arg4 ; - gfx::Format arg5 ; + ResourceResidency arg5 ; ccstd::string temp2 ; + uint32_t result; arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; @@ -5497,21 +6840,22 @@ static bool js_cc_render_Pipeline_updateRenderTarget__SWIG_0(se::State& s) ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - (arg1)->updateRenderTarget((ccstd::string const &)*arg2,arg3,arg4,arg5); + result = (arg1)->addShadingRateTexture((ccstd::string const &)*arg2,arg3,arg4,arg5); + + ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); return true; } -static bool js_cc_render_Pipeline_updateDepthStencil__SWIG_0(se::State& s) +static bool js_cc_render_Pipeline_updateStorageBuffer__SWIG_0(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; ccstd::string *arg2 = 0 ; uint32_t arg3 ; - uint32_t arg4 ; - gfx::Format arg5 ; + gfx::Format arg4 ; ccstd::string temp2 ; arg1 = SE_THIS_OBJECT(s); @@ -5527,13 +6871,9 @@ static bool js_cc_render_Pipeline_updateDepthStencil__SWIG_0(se::State& s) ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - - ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - (arg1)->updateDepthStencil((ccstd::string const &)*arg2,arg3,arg4,arg5); + (arg1)->updateStorageBuffer((ccstd::string const &)*arg2,arg3,arg4); return true; @@ -5612,57 +6952,22 @@ static bool js_cc_render_Pipeline_updateShadingRateTexture(se::State& s) } SE_BIND_FUNC(js_cc_render_Pipeline_updateShadingRateTexture) -static bool js_cc_render_Pipeline_beginFrame(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - size_t argc = args.size(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; - - if(argc != 0) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0); - return false; - } - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - (arg1)->beginFrame(); - - - return true; -} -SE_BIND_FUNC(js_cc_render_Pipeline_beginFrame) - -static bool js_cc_render_Pipeline_endFrame(se::State& s) +static bool js_cc_render_Pipeline_addRasterPass(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; - - if(argc != 0) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0); - return false; - } - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - (arg1)->endFrame(); - - - return true; -} -SE_BIND_FUNC(js_cc_render_Pipeline_endFrame) - -static bool js_cc_render_Pipeline_addRasterPass__SWIG_0(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; uint32_t arg2 ; uint32_t arg3 ; ccstd::string *arg4 = 0 ; ccstd::string temp4 ; cc::render::RasterPassBuilder *result = 0 ; + if(argc != 3) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 3); + return false; + } arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; @@ -5688,6 +6993,7 @@ static bool js_cc_render_Pipeline_addRasterPass__SWIG_0(se::State& s) return true; } +SE_BIND_FUNC(js_cc_render_Pipeline_addRasterPass) static bool js_cc_render_Pipeline_addComputePass(se::State& s) { @@ -5721,137 +7027,24 @@ static bool js_cc_render_Pipeline_addComputePass(se::State& s) } SE_BIND_FUNC(js_cc_render_Pipeline_addComputePass) -static bool js_cc_render_Pipeline_addMovePass(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - size_t argc = args.size(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; - cc::render::MovePassBuilder *result = 0 ; - - if(argc != 0) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0); - return false; - } - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - result = (cc::render::MovePassBuilder *)(arg1)->addMovePass(); - - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); - - - return true; -} -SE_BIND_FUNC(js_cc_render_Pipeline_addMovePass) - -static bool js_cc_render_Pipeline_addCopyPass(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - size_t argc = args.size(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; - cc::render::CopyPassBuilder *result = 0 ; - - if(argc != 0) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0); - return false; - } - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - result = (cc::render::CopyPassBuilder *)(arg1)->addCopyPass(); - - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); - - - return true; -} -SE_BIND_FUNC(js_cc_render_Pipeline_addCopyPass) - -static bool js_cc_render_Pipeline_createSceneTransversal(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - size_t argc = args.size(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; - cc::scene::Camera *arg2 = (cc::scene::Camera *) NULL ; - cc::scene::RenderScene *arg3 = (cc::scene::RenderScene *) NULL ; - cc::render::SceneTransversal *result = 0 ; - - if(argc != 2) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 2); - return false; - } - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - result = (cc::render::SceneTransversal *)(arg1)->createSceneTransversal((cc::scene::Camera const *)arg2,(cc::scene::RenderScene const *)arg3); - - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); - - - return true; -} -SE_BIND_FUNC(js_cc_render_Pipeline_createSceneTransversal) - -static bool js_cc_render_Pipeline_getDescriptorSetLayout(se::State& s) +static bool js_cc_render_Pipeline_addCustomBuffer(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; ccstd::string *arg2 = 0 ; - UpdateFrequency arg3 ; - ccstd::string temp2 ; - gfx::DescriptorSetLayout *result = 0 ; - - if(argc != 2) { - SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 2); - return false; - } - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg2 = &temp2; - - - ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - result = (gfx::DescriptorSetLayout *)(arg1)->getDescriptorSetLayout((ccstd::string const &)*arg2,arg3); - - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); - - - return true; -} -SE_BIND_FUNC(js_cc_render_Pipeline_getDescriptorSetLayout) - -static bool js_cc_render_Pipeline_addStorageBuffer__SWIG_1(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; - ccstd::string *arg2 = 0 ; - gfx::Format arg3 ; - uint32_t arg4 ; + gfx::BufferInfo *arg3 = 0 ; + std::string *arg4 = 0 ; ccstd::string temp2 ; + gfx::BufferInfo temp3 ; + std::string temp4 ; uint32_t result; + if(argc != 3) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 3); + return false; + } arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; @@ -5860,57 +7053,42 @@ static bool js_cc_render_Pipeline_addStorageBuffer__SWIG_1(se::State& s) arg2 = &temp2; - ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); + ok &= sevalue_to_native(args[1], &temp3, s.thisObject()); + SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg3 = &temp3; - ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg4 = &temp4; - result = (arg1)->addStorageBuffer((ccstd::string const &)*arg2,arg3,arg4); + result = (arg1)->addCustomBuffer((ccstd::string const &)*arg2,(gfx::BufferInfo const &)*arg3,(std::string const &)*arg4); ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); return true; } +SE_BIND_FUNC(js_cc_render_Pipeline_addCustomBuffer) -static bool js_cc_render_Pipeline_addStorageBuffer(se::State& s) +static bool js_cc_render_Pipeline_addCustomTexture(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - - - if (argc == 4) { - ok = js_cc_render_Pipeline_addStorageBuffer__SWIG_0(s); - if (ok) { - return true; - } - } - if (argc == 3) { - ok = js_cc_render_Pipeline_addStorageBuffer__SWIG_1(s); - if (ok) { - return true; - } - } - SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); - return false; -} -SE_BIND_FUNC(js_cc_render_Pipeline_addStorageBuffer) - -static bool js_cc_render_Pipeline_addRenderTarget__SWIG_1(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; ccstd::string *arg2 = 0 ; - gfx::Format arg3 ; - uint32_t arg4 ; - uint32_t arg5 ; + gfx::TextureInfo *arg3 = 0 ; + std::string *arg4 = 0 ; ccstd::string temp2 ; + gfx::TextureInfo temp3 ; + std::string temp4 ; uint32_t result; + if(argc != 3) { + SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 3); + return false; + } arg1 = SE_THIS_OBJECT(s); if (nullptr == arg1) return true; @@ -5919,50 +7097,25 @@ static bool js_cc_render_Pipeline_addRenderTarget__SWIG_1(se::State& s) arg2 = &temp2; - ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - - ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); + ok &= sevalue_to_native(args[1], &temp3, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg3 = &temp3; - ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); + ok &= sevalue_to_native(args[2], &temp4, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); + arg4 = &temp4; - result = (arg1)->addRenderTarget((ccstd::string const &)*arg2,arg3,arg4,arg5); + result = (arg1)->addCustomTexture((ccstd::string const &)*arg2,(gfx::TextureInfo const &)*arg3,(std::string const &)*arg4); ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); return true; } +SE_BIND_FUNC(js_cc_render_Pipeline_addCustomTexture) -static bool js_cc_render_Pipeline_addRenderTarget(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - size_t argc = args.size(); - - - if (argc == 5) { - ok = js_cc_render_Pipeline_addRenderTarget__SWIG_0(s); - if (ok) { - return true; - } - } - if (argc == 4) { - ok = js_cc_render_Pipeline_addRenderTarget__SWIG_1(s); - if (ok) { - return true; - } - } - SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); - return false; -} -SE_BIND_FUNC(js_cc_render_Pipeline_addRenderTarget) - -static bool js_cc_render_Pipeline_addDepthStencil__SWIG_1(se::State& s) +static bool js_cc_render_Pipeline_addStorageBuffer__SWIG_1(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); @@ -5970,7 +7123,6 @@ static bool js_cc_render_Pipeline_addDepthStencil__SWIG_1(se::State& s) ccstd::string *arg2 = 0 ; gfx::Format arg3 ; uint32_t arg4 ; - uint32_t arg5 ; ccstd::string temp2 ; uint32_t result; @@ -5989,11 +7141,7 @@ static bool js_cc_render_Pipeline_addDepthStencil__SWIG_1(se::State& s) ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); SE_PRECONDITION2(ok, false, "Error processing arguments"); - - ok &= sevalue_to_native(args[3], &arg5, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - result = (arg1)->addDepthStencil((ccstd::string const &)*arg2,arg3,arg4,arg5); + result = (arg1)->addStorageBuffer((ccstd::string const &)*arg2,arg3,arg4); ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); @@ -6001,21 +7149,21 @@ static bool js_cc_render_Pipeline_addDepthStencil__SWIG_1(se::State& s) return true; } -static bool js_cc_render_Pipeline_addDepthStencil(se::State& s) +static bool js_cc_render_Pipeline_addStorageBuffer(se::State& s) { CC_UNUSED bool ok = true; const auto& args = s.args(); size_t argc = args.size(); - if (argc == 5) { - ok = js_cc_render_Pipeline_addDepthStencil__SWIG_0(s); + if (argc == 4) { + ok = js_cc_render_Pipeline_addStorageBuffer__SWIG_0(s); if (ok) { return true; } } - if (argc == 4) { - ok = js_cc_render_Pipeline_addDepthStencil__SWIG_1(s); + if (argc == 3) { + ok = js_cc_render_Pipeline_addStorageBuffer__SWIG_1(s); if (ok) { return true; } @@ -6023,7 +7171,7 @@ static bool js_cc_render_Pipeline_addDepthStencil(se::State& s) SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); return false; } -SE_BIND_FUNC(js_cc_render_Pipeline_addDepthStencil) +SE_BIND_FUNC(js_cc_render_Pipeline_addStorageBuffer) static bool js_cc_render_Pipeline_addStorageTexture__SWIG_1(se::State& s) { @@ -6196,116 +7344,6 @@ static bool js_cc_render_Pipeline_updateStorageBuffer(se::State& s) } SE_BIND_FUNC(js_cc_render_Pipeline_updateStorageBuffer) -static bool js_cc_render_Pipeline_updateRenderTarget__SWIG_1(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; - ccstd::string *arg2 = 0 ; - uint32_t arg3 ; - uint32_t arg4 ; - ccstd::string temp2 ; - - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg2 = &temp2; - - - ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - - ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - (arg1)->updateRenderTarget((ccstd::string const &)*arg2,arg3,arg4); - - - return true; -} - -static bool js_cc_render_Pipeline_updateRenderTarget(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - size_t argc = args.size(); - - - if (argc == 4) { - ok = js_cc_render_Pipeline_updateRenderTarget__SWIG_0(s); - if (ok) { - return true; - } - } - if (argc == 3) { - ok = js_cc_render_Pipeline_updateRenderTarget__SWIG_1(s); - if (ok) { - return true; - } - } - SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); - return false; -} -SE_BIND_FUNC(js_cc_render_Pipeline_updateRenderTarget) - -static bool js_cc_render_Pipeline_updateDepthStencil__SWIG_1(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; - ccstd::string *arg2 = 0 ; - uint32_t arg3 ; - uint32_t arg4 ; - ccstd::string temp2 ; - - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= sevalue_to_native(args[0], &temp2, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - arg2 = &temp2; - - - ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - - ok &= sevalue_to_native(args[2], &arg4, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - (arg1)->updateDepthStencil((ccstd::string const &)*arg2,arg3,arg4); - - - return true; -} - -static bool js_cc_render_Pipeline_updateDepthStencil(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - size_t argc = args.size(); - - - if (argc == 4) { - ok = js_cc_render_Pipeline_updateDepthStencil__SWIG_0(s); - if (ok) { - return true; - } - } - if (argc == 3) { - ok = js_cc_render_Pipeline_updateDepthStencil__SWIG_1(s); - if (ok) { - return true; - } - } - SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); - return false; -} -SE_BIND_FUNC(js_cc_render_Pipeline_updateDepthStencil) - static bool js_cc_render_Pipeline_updateStorageTexture__SWIG_1(se::State& s) { CC_UNUSED bool ok = true; @@ -6361,60 +7399,6 @@ static bool js_cc_render_Pipeline_updateStorageTexture(se::State& s) } SE_BIND_FUNC(js_cc_render_Pipeline_updateStorageTexture) -static bool js_cc_render_Pipeline_addRasterPass__SWIG_1(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - cc::render::Pipeline *arg1 = (cc::render::Pipeline *) NULL ; - uint32_t arg2 ; - uint32_t arg3 ; - cc::render::RasterPassBuilder *result = 0 ; - - arg1 = SE_THIS_OBJECT(s); - if (nullptr == arg1) return true; - - ok &= sevalue_to_native(args[0], &arg2, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - - ok &= sevalue_to_native(args[1], &arg3, s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - - result = (cc::render::RasterPassBuilder *)(arg1)->addRasterPass(arg2,arg3); - - ok &= nativevalue_to_se(result, s.rval(), s.thisObject()); - SE_PRECONDITION2(ok, false, "Error processing arguments"); - SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval()); - s.rval().toObject()->getPrivateObject()->tryAllowDestroyInGC(); - - - return true; -} - -static bool js_cc_render_Pipeline_addRasterPass(se::State& s) -{ - CC_UNUSED bool ok = true; - const auto& args = s.args(); - size_t argc = args.size(); - - - if (argc == 3) { - ok = js_cc_render_Pipeline_addRasterPass__SWIG_0(s); - if (ok) { - return true; - } - } - if (argc == 2) { - ok = js_cc_render_Pipeline_addRasterPass__SWIG_1(s); - if (ok) { - return true; - } - } - SE_REPORT_ERROR("wrong number of arguments: %d", (int)argc); - return false; -} -SE_BIND_FUNC(js_cc_render_Pipeline_addRasterPass) - static bool js_delete_cc_render_Pipeline(se::State& s) { return true; @@ -6422,36 +7406,20 @@ static bool js_delete_cc_render_Pipeline(se::State& s) SE_BIND_FINALIZE_FUNC(js_delete_cc_render_Pipeline) bool js_register_cc_render_Pipeline(se::Object* obj) { - auto* cls = se::Class::create("Pipeline", obj, __jsb_cc_render_PipelineRuntime_proto, nullptr); + auto* cls = se::Class::create("Pipeline", obj, __jsb_cc_render_BasicPipeline_proto, nullptr); cls->defineStaticProperty("__isJSB", se::Value(true), se::PropertyAttribute::READ_ONLY | se::PropertyAttribute::DONT_ENUM | se::PropertyAttribute::DONT_DELETE); - cls->defineFunction("beginSetup", _SE(js_cc_render_Pipeline_beginSetup)); - cls->defineFunction("endSetup", _SE(js_cc_render_Pipeline_endSetup)); - cls->defineFunction("containsResource", _SE(js_cc_render_Pipeline_containsResource)); - cls->defineFunction("addRenderTexture", _SE(js_cc_render_Pipeline_addRenderTexture)); - cls->defineFunction("addRenderWindow", _SE(js_cc_render_Pipeline_addRenderWindow)); - cls->defineFunction("updateRenderWindow", _SE(js_cc_render_Pipeline_updateRenderWindow)); - cls->defineFunction("addCustomBuffer", _SE(js_cc_render_Pipeline_addCustomBuffer)); - cls->defineFunction("addCustomTexture", _SE(js_cc_render_Pipeline_addCustomTexture)); cls->defineFunction("updateShadingRateTexture", _SE(js_cc_render_Pipeline_updateShadingRateTexture)); - cls->defineFunction("beginFrame", _SE(js_cc_render_Pipeline_beginFrame)); - cls->defineFunction("endFrame", _SE(js_cc_render_Pipeline_endFrame)); + cls->defineFunction("addRasterPass", _SE(js_cc_render_Pipeline_addRasterPass)); cls->defineFunction("addComputePass", _SE(js_cc_render_Pipeline_addComputePass)); - cls->defineFunction("addMovePass", _SE(js_cc_render_Pipeline_addMovePass)); - cls->defineFunction("addCopyPass", _SE(js_cc_render_Pipeline_addCopyPass)); - cls->defineFunction("createSceneTransversal", _SE(js_cc_render_Pipeline_createSceneTransversal)); - cls->defineFunction("getDescriptorSetLayout", _SE(js_cc_render_Pipeline_getDescriptorSetLayout)); + cls->defineFunction("addCustomBuffer", _SE(js_cc_render_Pipeline_addCustomBuffer)); + cls->defineFunction("addCustomTexture", _SE(js_cc_render_Pipeline_addCustomTexture)); cls->defineFunction("addStorageBuffer", _SE(js_cc_render_Pipeline_addStorageBuffer)); - cls->defineFunction("addRenderTarget", _SE(js_cc_render_Pipeline_addRenderTarget)); - cls->defineFunction("addDepthStencil", _SE(js_cc_render_Pipeline_addDepthStencil)); cls->defineFunction("addStorageTexture", _SE(js_cc_render_Pipeline_addStorageTexture)); cls->defineFunction("addShadingRateTexture", _SE(js_cc_render_Pipeline_addShadingRateTexture)); cls->defineFunction("updateStorageBuffer", _SE(js_cc_render_Pipeline_updateStorageBuffer)); - cls->defineFunction("updateRenderTarget", _SE(js_cc_render_Pipeline_updateRenderTarget)); - cls->defineFunction("updateDepthStencil", _SE(js_cc_render_Pipeline_updateDepthStencil)); cls->defineFunction("updateStorageTexture", _SE(js_cc_render_Pipeline_updateStorageTexture)); - cls->defineFunction("addRasterPass", _SE(js_cc_render_Pipeline_addRasterPass)); @@ -6486,7 +7454,7 @@ static bool js_cc_render_PipelineBuilder_setup(se::State& s) size_t argc = args.size(); cc::render::PipelineBuilder *arg1 = (cc::render::PipelineBuilder *) NULL ; ccstd::vector< cc::scene::Camera * > *arg2 = 0 ; - cc::render::Pipeline *arg3 = (cc::render::Pipeline *) NULL ; + cc::render::BasicPipeline *arg3 = (cc::render::BasicPipeline *) NULL ; ccstd::vector< cc::scene::Camera * > temp2 ; if(argc != 2) { @@ -6779,6 +7747,7 @@ bool register_all_render(se::Object* obj) { js_register_cc_render_RasterSubpassBuilder(ns); js_register_cc_render_ComputeQueueBuilder(ns); js_register_cc_render_ComputeSubpassBuilder(ns); + js_register_cc_render_BasicRenderPassBuilder(ns); js_register_cc_render_RasterPassBuilder(ns); js_register_cc_render_ComputePassBuilder(ns); js_register_cc_render_MovePassBuilder(ns); @@ -6786,6 +7755,7 @@ bool register_all_render(se::Object* obj) { js_register_cc_render_SceneVisitor(ns); js_register_cc_render_SceneTask(ns); js_register_cc_render_SceneTransversal(ns); + js_register_cc_render_BasicPipeline(ns); js_register_cc_render_Pipeline(ns); js_register_cc_render_PipelineBuilder(ns); js_register_cc_render_RenderingModule(ns); diff --git a/native/cocos/bindings/auto/jsb_render_auto.h b/native/cocos/bindings/auto/jsb_render_auto.h index 6cab9f3b335..147c9305a37 100644 --- a/native/cocos/bindings/auto/jsb_render_auto.h +++ b/native/cocos/bindings/auto/jsb_render_auto.h @@ -78,6 +78,11 @@ extern se::Object *__jsb_cc_render_ComputeSubpassBuilder_proto; // NOLINT extern se::Class * __jsb_cc_render_ComputeSubpassBuilder_class; // NOLINT +JSB_REGISTER_OBJECT_TYPE(cc::render::BasicRenderPassBuilder); +extern se::Object *__jsb_cc_render_BasicRenderPassBuilder_proto; // NOLINT +extern se::Class * __jsb_cc_render_BasicRenderPassBuilder_class; // NOLINT + + JSB_REGISTER_OBJECT_TYPE(cc::render::RasterPassBuilder); extern se::Object *__jsb_cc_render_RasterPassBuilder_proto; // NOLINT extern se::Class * __jsb_cc_render_RasterPassBuilder_class; // NOLINT @@ -113,6 +118,11 @@ extern se::Object *__jsb_cc_render_SceneTransversal_proto; // NOLINT extern se::Class * __jsb_cc_render_SceneTransversal_class; // NOLINT +JSB_REGISTER_OBJECT_TYPE(cc::render::BasicPipeline); +extern se::Object *__jsb_cc_render_BasicPipeline_proto; // NOLINT +extern se::Class * __jsb_cc_render_BasicPipeline_class; // NOLINT + + JSB_REGISTER_OBJECT_TYPE(cc::render::Pipeline); extern se::Object *__jsb_cc_render_Pipeline_proto; // NOLINT extern se::Class * __jsb_cc_render_Pipeline_class; // NOLINT diff --git a/native/cocos/renderer/core/MaterialInstance.cpp b/native/cocos/renderer/core/MaterialInstance.cpp index 322a35aba0c..3c3935a312e 100644 --- a/native/cocos/renderer/core/MaterialInstance.cpp +++ b/native/cocos/renderer/core/MaterialInstance.cpp @@ -23,7 +23,7 @@ ***************************************************************************/ #include "renderer/core/MaterialInstance.h" -//#include "core/components/RenderableComponent.h" +// #include "core/components/RenderableComponent.h" #include "renderer/core/PassInstance.h" namespace cc { diff --git a/native/cocos/renderer/frame-graph/DevicePass.cpp b/native/cocos/renderer/frame-graph/DevicePass.cpp index 0c4d0e36099..f8ef50106f7 100644 --- a/native/cocos/renderer/frame-graph/DevicePass.cpp +++ b/native/cocos/renderer/frame-graph/DevicePass.cpp @@ -156,12 +156,9 @@ void DevicePass::passDependency(gfx::RenderPassInfo &rpInfo) { subpassIndex > 1 ? subpassIndex - 1 : gfx::SUBPASS_EXTERNAL, subpassIndex, nullptr, - bufferBarriers.data() + lastBufferIndex, - buffers.data() + lastBufferIndex, - static_cast(buffers.size() - lastBufferIndex), - textureBarriers.data() + lastTextureIndex, - textures.data() + lastTextureIndex, - static_cast(textures.size() - lastTextureIndex)}); + {}, + {}, + }); for (const auto &rearBarrier : _barriers[barrierID].get().rearBarriers) { const auto &res = getBarrier(rearBarrier, &_resourceTable); @@ -191,12 +188,9 @@ void DevicePass::passDependency(gfx::RenderPassInfo &rpInfo) { _subpasses.empty() ? 0 : static_cast(_subpasses.size() - 1), gfx::SUBPASS_EXTERNAL, nullptr, - bufferBarriers.data() + lastBufferIndex, - buffers.data() + lastBufferIndex, - static_cast(buffers.size() - lastBufferIndex), - textureBarriers.data() + lastTextureIndex, - textures.data() + lastTextureIndex, - static_cast(textures.size() - lastTextureIndex)}); + {}, + {}, + }); } } } diff --git a/native/cocos/renderer/gfx-base/GFXDef-common.h b/native/cocos/renderer/gfx-base/GFXDef-common.h index 2180ce53a1f..30de360c823 100644 --- a/native/cocos/renderer/gfx-base/GFXDef-common.h +++ b/native/cocos/renderer/gfx-base/GFXDef-common.h @@ -1329,16 +1329,14 @@ struct SubpassInfo { using SubpassInfoList = ccstd::vector; +using AccessFlagList = ccstd::vector; struct ALIGNAS(8) SubpassDependency { uint32_t srcSubpass{0}; uint32_t dstSubpass{0}; GeneralBarrier *generalBarrier{nullptr}; - BufferBarrier **bufferBarriers{nullptr}; - Buffer **buffers{nullptr}; - uint32_t bufferBarrierCount{0}; - TextureBarrier **textureBarriers{nullptr}; - Texture **textures{nullptr}; - uint32_t textureBarrierCount{0}; + + AccessFlagList prevAccesses{}; + AccessFlagList nextAccesses{}; #if CC_CPU_ARCH == CC_CPU_ARCH_32 uint32_t _padding{0}; #endif diff --git a/native/cocos/renderer/gfx-base/GFXDef.cpp b/native/cocos/renderer/gfx-base/GFXDef.cpp index f48ec4894d9..c7e35253f44 100644 --- a/native/cocos/renderer/gfx-base/GFXDef.cpp +++ b/native/cocos/renderer/gfx-base/GFXDef.cpp @@ -60,11 +60,21 @@ bool operator==(const DepthStencilAttachment &lhs, const DepthStencilAttachment template <> ccstd::hash_t Hasher::operator()(const SubpassDependency &info) const { - return quickHashTrivialStruct(&info); + ccstd::hash_t seed = 8; + ccstd::hash_combine(seed, info.dstSubpass); + ccstd::hash_combine(seed, info.srcSubpass); + ccstd::hash_combine(seed, info.generalBarrier); + ccstd::hash_combine(seed, info.prevAccesses); + ccstd::hash_combine(seed, info.nextAccesses); + return seed; } bool operator==(const SubpassDependency &lhs, const SubpassDependency &rhs) { - return !memcmp(&lhs, &rhs, sizeof(SubpassDependency)); + return lhs.srcSubpass == rhs.srcSubpass && + lhs.dstSubpass == rhs.dstSubpass && + lhs.generalBarrier == rhs.generalBarrier && + lhs.prevAccesses == rhs.prevAccesses && + lhs.nextAccesses == rhs.nextAccesses; } template <> diff --git a/native/cocos/renderer/gfx-gles3/GLES3Commands.cpp b/native/cocos/renderer/gfx-gles3/GLES3Commands.cpp index 4673bf0015e..8a73566423c 100644 --- a/native/cocos/renderer/gfx-gles3/GLES3Commands.cpp +++ b/native/cocos/renderer/gfx-gles3/GLES3Commands.cpp @@ -1458,7 +1458,6 @@ void cmdFuncGLES3CreateRenderPass(GLES3Device * /*device*/, GLES3GPURenderPass * gpuRenderPass->statistics[i].storeSubpass != SUBPASS_EXTERNAL); } - ccstd::unordered_map> resRecord; // if barrier deduce enabled: should deduce this from subpass & attachment access infos if constexpr (ENABLE_GRAPH_AUTO_BARRIER) { gpuRenderPass->subpassBarriers.resize(gpuRenderPass->dependencies.size()); @@ -1472,39 +1471,16 @@ void cmdFuncGLES3CreateRenderPass(GLES3Device * /*device*/, GLES3GPURenderPass * completeBarrier(&gpuRenderPass->blockBarrier); } - if (dependency.bufferBarrierCount) { - for (size_t index = 0; index < dependency.bufferBarrierCount; ++index) { - barrier.prevAccesses = dependency.bufferBarriers[index]->getInfo().prevAccesses; - barrier.nextAccesses = dependency.bufferBarriers[index]->getInfo().nextAccesses; - completeBarrier(&barrier); - auto iter = resRecord.find(dependency.buffers[index]); - if (iter == resRecord.end()) { - resRecord.insert({dependency.buffers[index], std::pair(barrier.glBarriers, barrier.glBarriersByRegion)}); - } else { - iter->second = std::pair(barrier.glBarriers, barrier.glBarriersByRegion); - } - } - } + CC_ASSERT(dependency.prevAccesses.size() == dependency.nextAccesses.size()); - if (dependency.textureBarrierCount) { - for (size_t index = 0; index < dependency.textureBarrierCount; ++index) { - barrier.prevAccesses = dependency.textureBarriers[index]->getInfo().prevAccesses; - barrier.nextAccesses = dependency.textureBarriers[index]->getInfo().nextAccesses; - completeBarrier(&barrier); - auto iter = resRecord.find(dependency.textures[index]); - if (iter == resRecord.end()) { - resRecord.insert({dependency.textures[index], std::pair(barrier.glBarriers, barrier.glBarriersByRegion)}); - } else { - iter->second = std::pair(barrier.glBarriers, barrier.glBarriersByRegion); - } - } - } - } + for (size_t index = 0; index < dependency.prevAccesses.size(); ++index) { + barrier.prevAccesses = dependency.prevAccesses[i]; + barrier.nextAccesses = dependency.nextAccesses[i]; + completeBarrier(&barrier); - for (const auto &pair : resRecord) { - const auto &barrier = pair.second; - gpuRenderPass->blockBarrier.glBarriers |= barrier.first; - gpuRenderPass->blockBarrier.glBarriersByRegion |= barrier.second; + gpuRenderPass->blockBarrier.glBarriers |= barrier.glBarriers; + gpuRenderPass->blockBarrier.glBarriersByRegion |= barrier.glBarriersByRegion; + } } } else { gpuRenderPass->subpassBarriers.resize(gpuRenderPass->subpasses.size() + 1); diff --git a/native/cocos/renderer/gfx-metal/MTLGPUObjects.h b/native/cocos/renderer/gfx-metal/MTLGPUObjects.h index 5bc02db2538..48a0243eb79 100644 --- a/native/cocos/renderer/gfx-metal/MTLGPUObjects.h +++ b/native/cocos/renderer/gfx-metal/MTLGPUObjects.h @@ -96,9 +96,17 @@ struct CCMTLGPUSubpassAttachment { uint32_t binding = INVALID_BINDING; }; +struct ResourceBinding { + uint32_t bufferBinding{0}; + uint32_t textureBinding{0}; + uint32_t samplerBinding{0}; +}; + struct CCMTLGPUShader { ccstd::unordered_map blocks; ccstd::unordered_map samplers; + + ccstd::unordered_map resourceBinding; ccstd::vector inputs; ccstd::vector outputs; @@ -108,6 +116,8 @@ struct CCMTLGPUShader { uint32_t bufferIndex = 0; uint32_t samplerIndex = 0; + + std::string name; }; struct CCMTLGPUPipelineState { diff --git a/native/cocos/renderer/gfx-metal/MTLUtils.mm b/native/cocos/renderer/gfx-metal/MTLUtils.mm index 3d8cad6c4d8..5dfd67089a4 100644 --- a/native/cocos/renderer/gfx-metal/MTLUtils.mm +++ b/native/cocos/renderer/gfx-metal/MTLUtils.mm @@ -937,8 +937,6 @@ void main() { // The SPIR-V is now parsed, and we can perform reflection on it. auto executionModel = msl.get_execution_model(); - spirv_cross::MSLResourceBinding newBinding; - newBinding.stage = executionModel; auto active = msl.get_active_interface_variables(); spirv_cross::ShaderResources resources = msl.get_shader_resources(active); msl.set_enabled_interface_variables(std::move(active)); @@ -976,23 +974,24 @@ void main() { } uint32_t fakeHash = set * 128 + binding; - if (gpuShader->blocks.find(fakeHash) == gpuShader->blocks.end()) { - auto mappedBinding = gpuShader->bufferIndex; - newBinding.desc_set = set; - newBinding.binding = binding; + spirv_cross::MSLResourceBinding newBinding; + newBinding.stage = executionModel; + auto mappedBinding = gpuShader->bufferIndex; + newBinding.desc_set = set; + newBinding.binding = binding; + if (gpuShader->resourceBinding.find(fakeHash) == gpuShader->resourceBinding.end()) { newBinding.msl_buffer = mappedBinding; - msl.add_msl_resource_binding(newBinding); gpuShader->blocks[fakeHash] = {ubo.name, set, binding, mappedBinding, shaderType, size}; + gpuShader->resourceBinding[fakeHash] = {mappedBinding, 0, 0}; + ++gpuShader->bufferIndex; } else { - auto mappedBinding = gpuShader->blocks[fakeHash].mappedBinding; - newBinding.desc_set = set; - newBinding.binding = binding; - newBinding.msl_buffer = mappedBinding; - msl.add_msl_resource_binding(newBinding); gpuShader->blocks[fakeHash].stages |= shaderType; + gpuShader->resourceBinding[fakeHash].bufferBinding = gpuShader->blocks[fakeHash].mappedBinding; + newBinding.msl_sampler = gpuShader->resourceBinding[fakeHash].samplerBinding; + newBinding.msl_texture = gpuShader->resourceBinding[fakeHash].textureBinding; + newBinding.msl_buffer = gpuShader->resourceBinding[fakeHash].bufferBinding; } - //msl.set_decoration(ubo.id, spv::DecorationLocation, gpuShader->blocks[nameHash].mappedBinding); - ++gpuShader->bufferIndex; + msl.add_msl_resource_binding(newBinding); } for (const auto &ubo : resources.storage_buffers) { @@ -1005,23 +1004,25 @@ void main() { } uint32_t fakeHash = set * 128 + binding; - if (gpuShader->blocks.find(fakeHash) == gpuShader->blocks.end()) { - auto mappedBinding = gpuShader->bufferIndex; - newBinding.desc_set = set; - newBinding.binding = binding; - newBinding.msl_buffer = mappedBinding; - msl.add_msl_resource_binding(newBinding); + spirv_cross::MSLResourceBinding newBinding; + newBinding.stage = executionModel; + auto mappedBinding = gpuShader->bufferIndex; + newBinding.desc_set = set; + newBinding.binding = binding; + newBinding.msl_buffer = mappedBinding; + if (gpuShader->resourceBinding.find(fakeHash) == gpuShader->resourceBinding.end()) { gpuShader->blocks[fakeHash] = {ubo.name, set, binding, mappedBinding, shaderType, size}; + gpuShader->resourceBinding[fakeHash] = {mappedBinding, 0, 0}; + ++gpuShader->bufferIndex; } else { auto mappedBinding = gpuShader->blocks[fakeHash].mappedBinding; - newBinding.desc_set = set; - newBinding.binding = binding; - newBinding.msl_buffer = mappedBinding; - msl.add_msl_resource_binding(newBinding); gpuShader->blocks[fakeHash].stages |= shaderType; + gpuShader->resourceBinding[fakeHash].bufferBinding = mappedBinding; + newBinding.msl_sampler = gpuShader->resourceBinding[fakeHash].samplerBinding; + newBinding.msl_texture = gpuShader->resourceBinding[fakeHash].textureBinding; + newBinding.msl_buffer = gpuShader->resourceBinding[fakeHash].bufferBinding; } - //msl.set_decoration(ubo.id, spv::DecorationLocation, gpuShader->blocks[nameHash].mappedBinding); - ++gpuShader->bufferIndex; + msl.add_msl_resource_binding(newBinding); } //TODO: coulsonwang, need to set sampler binding explicitly @@ -1043,18 +1044,27 @@ void main() { for (int i = 0; i < size; ++i) { auto mappedBinding = gpuShader->samplerIndex + rtOffsets; + uint32_t fakeHash = set * 128 + binding; + spirv_cross::MSLResourceBinding newBinding; + newBinding.stage = executionModel; newBinding.desc_set = set; newBinding.binding = binding + i; newBinding.msl_texture = mappedBinding; newBinding.msl_sampler = gpuShader->samplerIndex; - msl.add_msl_resource_binding(newBinding); - - if (gpuShader->samplers.find(mappedBinding) == gpuShader->samplers.end()) { + + if(gpuShader->resourceBinding.find(fakeHash) == gpuShader->resourceBinding.end()) { + gpuShader->resourceBinding[fakeHash] = {0, mappedBinding, mappedBinding}; gpuShader->samplers[mappedBinding] = {sampler.name, set, binding, newBinding.msl_texture, newBinding.msl_sampler, shaderType}; + ++gpuShader->samplerIndex; } else { + gpuShader->resourceBinding[fakeHash].samplerBinding = mappedBinding; + gpuShader->resourceBinding[fakeHash].textureBinding = mappedBinding; gpuShader->samplers[mappedBinding].stages |= shaderType; + newBinding.msl_buffer = gpuShader->resourceBinding[fakeHash].bufferBinding; + newBinding.msl_texture = gpuShader->resourceBinding[fakeHash].textureBinding; + newBinding.msl_sampler = gpuShader->resourceBinding[fakeHash].samplerBinding; } - ++gpuShader->samplerIndex; + msl.add_msl_resource_binding(newBinding); } } @@ -1077,7 +1087,21 @@ void main() { gpuShader->inputs[i].name = attachment.name; auto set = msl.get_decoration(attachment.id, spv::DecorationDescriptorSet); auto index = msl.get_decoration(attachment.id, spv::DecorationInputAttachmentIndex); + auto binding = msl.get_decoration(attachment.id, spv::DecorationBinding); + + spirv_cross::MSLResourceBinding textureBinding; + textureBinding.stage = executionModel; + uint32_t fakeHash = set * 128 + binding; + if(gpuShader->resourceBinding.find(fakeHash) == gpuShader->resourceBinding.end()) { + gpuShader->resourceBinding[fakeHash] = {0, index, index}; + } else { + gpuShader->resourceBinding[fakeHash].samplerBinding = index; + gpuShader->resourceBinding[fakeHash].textureBinding = index; + textureBinding.msl_buffer = gpuShader->resourceBinding[fakeHash].bufferBinding; + } msl.set_decoration(attachment.id, spv::DecorationBinding, index); + // avoid (set, index) collision + msl.set_decoration(attachment.id, spv::DecorationDescriptorSet, 4); gpuShader->inputs[i].binding = index; gpuShader->inputs[i].set = set; } diff --git a/native/cocos/renderer/gfx-vulkan/VKCommandBuffer.cpp b/native/cocos/renderer/gfx-vulkan/VKCommandBuffer.cpp index 224bea4b7d1..4481d7cd3c9 100644 --- a/native/cocos/renderer/gfx-vulkan/VKCommandBuffer.cpp +++ b/native/cocos/renderer/gfx-vulkan/VKCommandBuffer.cpp @@ -156,7 +156,7 @@ void CCVKCommandBuffer::beginRenderPass(RenderPass *renderPass, Framebuffer *fbo const auto &dependencies = renderPass->getDependencies(); if (!dependencies.empty()) { const auto &frontBarrier = dependencies.front(); - pipelineBarrier(frontBarrier.generalBarrier, frontBarrier.bufferBarriers, frontBarrier.buffers, frontBarrier.bufferBarrierCount, frontBarrier.textureBarriers, frontBarrier.textures, frontBarrier.textureBarrierCount); + //pipelineBarrier(frontBarrier.generalBarrier, frontBarrier.bufferBarriers, frontBarrier.buffers, frontBarrier.bufferBarrierCount, frontBarrier.textureBarriers, frontBarrier.textures, frontBarrier.textureBarrierCount); } } @@ -236,7 +236,7 @@ void CCVKCommandBuffer::endRenderPass() { const auto &dependencies = _curGPURenderPass->dependencies; if (!dependencies.empty()) { const auto &rearBarrier = _curGPURenderPass->dependencies.back(); - pipelineBarrier(rearBarrier.generalBarrier, rearBarrier.bufferBarriers, rearBarrier.buffers, rearBarrier.bufferBarrierCount, rearBarrier.textureBarriers, rearBarrier.textures, rearBarrier.textureBarrierCount); + //pipelineBarrier(rearBarrier.generalBarrier, rearBarrier.bufferBarriers, rearBarrier.buffers, rearBarrier.bufferBarrierCount, rearBarrier.textureBarriers, rearBarrier.textures, rearBarrier.textureBarrierCount); } } } diff --git a/native/cocos/renderer/gfx-vulkan/VKCommands.cpp b/native/cocos/renderer/gfx-vulkan/VKCommands.cpp index e9fab74ffff..bd2e36d1a76 100644 --- a/native/cocos/renderer/gfx-vulkan/VKCommands.cpp +++ b/native/cocos/renderer/gfx-vulkan/VKCommands.cpp @@ -590,17 +590,31 @@ void cmdFuncCCVKCreateRenderPass(CCVKDevice *device, CCVKGPURenderPass *gpuRende vkDependency.dstSubpass = dependency.dstSubpass; vkDependency.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; - auto addStageAccessMask = [&vkDependency](const auto *barrier) { + auto addStageAccessMask = [&vkDependency](const SubpassDependency& deps) { VkPipelineStageFlags srcStageMask; VkAccessFlags srcAccessMask; VkPipelineStageFlags dstStageMask; VkAccessFlags dstAccessMask; VkImageLayout imageLayout{VK_IMAGE_LAYOUT_UNDEFINED}; bool hasWriteAccess{false}; - const auto *gpuBarrier{barrier->gpuBarrier()}; + ccstd::vector prev; + ccstd::vector next; + + ccstd::unordered_set flags; + for (const auto &access : deps.prevAccesses) { + if (flags.emplace(access).second) { + getAccessTypes(access, prev); + } + } + flags.clear(); + for (const auto &access : deps.nextAccesses) { + if (flags.emplace(access).second) { + getAccessTypes(access, next); + } + } thsvsGetAccessInfo( - utils::toUint(gpuBarrier->prevAccesses.size()), - gpuBarrier->prevAccesses.data(), + utils::toUint(prev.size()), + prev.data(), &srcStageMask, &srcAccessMask, &imageLayout, &hasWriteAccess); @@ -608,8 +622,8 @@ void cmdFuncCCVKCreateRenderPass(CCVKDevice *device, CCVKGPURenderPass *gpuRende // offset += gpuBarrier->prevAccesses.size(); thsvsGetAccessInfo( - utils::toUint(gpuBarrier->nextAccesses.size()), - gpuBarrier->nextAccesses.data(), + utils::toUint(next.size()), + next.data(), &dstStageMask, &dstAccessMask, &imageLayout, &hasWriteAccess); @@ -622,21 +636,7 @@ void cmdFuncCCVKCreateRenderPass(CCVKDevice *device, CCVKGPURenderPass *gpuRende dependencyManager.append(vkDependency); }; - if (dependency.generalBarrier) { - addStageAccessMask(static_cast(dependency.generalBarrier)); - } - - if (dependency.textureBarriers) { - for (size_t index = 0; index < dependency.textureBarrierCount; ++index) { - addStageAccessMask(static_cast(dependency.textureBarriers[index])); - } - } - - if (dependency.bufferBarriers) { - for (size_t index = 0; index < dependency.bufferBarrierCount; ++index) { - addStageAccessMask(static_cast(dependency.bufferBarriers[index])); - } - } + addStageAccessMask(dependency); } } else { diff --git a/native/cocos/renderer/pipeline/PlanarShadowQueue.cpp b/native/cocos/renderer/pipeline/PlanarShadowQueue.cpp index fa56b20a6cb..144132f66c1 100644 --- a/native/cocos/renderer/pipeline/PlanarShadowQueue.cpp +++ b/native/cocos/renderer/pipeline/PlanarShadowQueue.cpp @@ -92,17 +92,19 @@ void PlanarShadowQueue::gatherShadowPasses(scene::Camera *camera, gfx::CommandBu const auto &subModels = model->getSubModels(); for (const auto &subModel : subModels) { - const auto &subModelPasses = subModel->getPasses(); - for (index_t i = 0; i < static_cast(subModelPasses.size()); ++i) { - const auto subModelPass = subModelPasses[i]; - const auto batchingScheme = subModelPass->getBatchingScheme(); - if (batchingScheme == scene::BatchingSchemes::INSTANCING) { - instancedBuffer->merge(subModel, i, subModel->getPlanarInstanceShader()); - _instancedQueue->add(instancedBuffer); - } else { // standard draw - _pendingSubModels.emplace_back(subModel); - } - } + + //yc TODO:planar shadow cant use instance. + //const auto &subModelPasses = subModel->getPasses(); + //for (index_t i = 0; i < static_cast(subModelPasses.size()); ++i) { + // const auto subModelPass = subModelPasses[i]; + // const auto batchingScheme = subModelPass->getBatchingScheme(); + // if (batchingScheme == scene::BatchingSchemes::INSTANCING) { + // instancedBuffer->merge(subModel, i, subModel->getPlanarInstanceShader()); + // _instancedQueue->add(instancedBuffer); + // } else { // standard draw + _pendingSubModels.emplace_back(subModel); + // } + //} } } diff --git a/native/cocos/renderer/pipeline/custom/FGDispatcherTypes.h b/native/cocos/renderer/pipeline/custom/FGDispatcherTypes.h index bfef21403ae..0da751b938e 100644 --- a/native/cocos/renderer/pipeline/custom/FGDispatcherTypes.h +++ b/native/cocos/renderer/pipeline/custom/FGDispatcherTypes.h @@ -106,6 +106,12 @@ struct ResourceAccessNode { struct ResourceAccessNode* nextSubpass{nullptr}; }; +struct FGRenderPassInfo { + std::vector> colorAccesses; + std::pair dsAccess; + gfx::RenderPassInfo rpInfo; +}; + struct ResourceAccessGraph { using allocator_type = boost::container::pmr::polymorphic_allocator; allocator_type get_allocator() const noexcept { // NOLINT @@ -246,6 +252,7 @@ struct ResourceAccessGraph { PmrFlatMap accessRecord; PmrFlatMap resourceLifeRecord; ccstd::pmr::vector topologicalOrder; + PmrFlatMap rpInfos; }; struct RelationGraph { @@ -395,13 +402,13 @@ struct FrameGraphDispatcher { FrameGraphDispatcher& operator=(FrameGraphDispatcher&& rhs) = delete; FrameGraphDispatcher& operator=(FrameGraphDispatcher const& rhs) = delete; - using BarrierMap = FlatMap; + using BarrierMap = PmrMap; void enablePassReorder(bool enable); // how much paralell-execution weights during pass reorder, // eg:0.3 means 30% of effort aim to paralellize execution, other 70% aim to decrease memory using. - // 0 by default + // 0 by default void setParalellWeight(float paralellExecWeight); void enableMemoryAliasing(bool enable); diff --git a/native/cocos/renderer/pipeline/custom/FrameGraphDispatcher.cpp b/native/cocos/renderer/pipeline/custom/FrameGraphDispatcher.cpp index 4a2c4b2a6df..64360629a90 100644 --- a/native/cocos/renderer/pipeline/custom/FrameGraphDispatcher.cpp +++ b/native/cocos/renderer/pipeline/custom/FrameGraphDispatcher.cpp @@ -123,7 +123,7 @@ struct Graphs { }; struct ViewStatus { - const PmrString &name; + PmrString name; const PassType passType; const gfx::ShaderStageFlagBit visibility; const gfx::MemoryAccessBit access; @@ -164,14 +164,21 @@ gfx::MemoryAccessBit toGfxAccess(AccessType type) { } }; +// TODO(Zeqiang): remove barrier in renderpassinfo +gfx::GeneralBarrier *getGeneralBarrier(gfx::Device *device, gfx::AccessFlagBit prevAccess, gfx::AccessFlagBit nextAccess) { + return device->getGeneralBarrier({prevAccess, nextAccess}); +} + // AccessStatus.vertID : in resourceNode it's resource ID; in barrierNode it's pass ID. AccessVertex dependencyCheck(RAG &rag, AccessVertex curVertID, const ResourceGraph &rg, const ViewStatus &status); gfx::ShaderStageFlagBit getVisibilityByDescName(const RenderGraph &renderGraph, const LGD &lgd, uint32_t passID, const PmrString &resName); -void addAccessStatus(RAG &rag, const ResourceGraph &rg, ResourceAccessNode &node, const ViewStatus &status); +PmrString addAccessStatus(RAG &rag, const ResourceGraph &rg, ResourceAccessNode &node, const ViewStatus &status); void addCopyAccessStatus(RAG &rag, const ResourceGraph &rg, ResourceAccessNode &node, const ViewStatus &status, const Range &range); void processRasterPass(const Graphs &graphs, uint32_t passID, const RasterPass &pass); void processComputePass(const Graphs &graphs, uint32_t passID, const ComputePass &pass); +void processRasterSubpass(const Graphs &graphs, uint32_t passID, const RasterSubpass &pass); +void processComputeSubpass(const Graphs &graphs, uint32_t passID, const ComputeSubpass &pass); void processCopyPass(const Graphs &graphs, uint32_t passID, const CopyPass &pass); void processRaytracePass(const Graphs &graphs, uint32_t passID, const RaytracePass &pass); auto getResourceStatus(PassType passType, const PmrString &name, gfx::MemoryAccess memAccess, gfx::ShaderStageFlags visibility, const ResourceGraph &resourceGraph, bool rasterized); @@ -245,6 +252,12 @@ void buildAccessGraph(const Graphs &graphs) { [&](const RasterPass &pass) { processRasterPass(graphs, passID, pass); }, + [&](const RasterSubpass &pass) { + processRasterSubpass(graphs, passID, pass); + }, + [&](const ComputeSubpass &pass) { + processComputeSubpass(graphs, passID, pass); + }, [&](const ComputePass &pass) { processComputePass(graphs, passID, pass); }, @@ -338,16 +351,16 @@ struct BarrierVisitor : public boost::bfs_visitor<> { explicit BarrierVisitor( const ResourceGraph &rg, - BarrierMap &barriers, // what we get - ExternalResMap &extMap, // record external res between frames - ResourceNames &resourceNamesIn, // for resource record - const AccessTable &accessRecordIn, // resource last meet - ResourceLifeRecordMap &rescLifeRecord // resource lifetime - ) - : barrierMap(barriers), resourceGraph(rg), externalMap(extMap), resourceNames(resourceNamesIn), accessRecord(accessRecordIn), resourceLifeRecord(rescLifeRecord) {} + BarrierMap &barriers, // what we get + ExternalResMap &extMap, // record external res between frames + ResourceNames &resourceNamesIn, // for resource record + const AccessTable &accessRecordIn, // resource last meet + ResourceLifeRecordMap &rescLifeRecord, // resource lifetime + PmrFlatMap &rpInfosIn) + : barrierMap(barriers), resourceGraph(rg), externalMap(extMap), resourceNames(resourceNamesIn), accessRecord(accessRecordIn), resourceLifeRecord(rescLifeRecord), rpInfos(rpInfosIn) {} void updateResourceLifeTime(const ResourceAccessNode &node, ResourceAccessGraph::vertex_descriptor u) { - for (auto access : node.attachmentStatus) { + for (const auto &access : node.attachmentStatus) { auto name = get(ResourceGraph::NameTag{}, resourceGraph, access.vertID); if (resourceLifeRecord.find(name) == resourceLifeRecord.end()) { resourceLifeRecord.emplace(name, ResourceLifeRecord{u, u}); @@ -361,6 +374,7 @@ struct BarrierVisitor : public boost::bfs_visitor<> { const std::vector &status; std::vector &edgeBarriers; // need to barrier front or back const Vertex &vertID; + uint32_t subpassIndex{INVALID_ID}; }; void processVertex(Vertex u, const Graph &g) { @@ -381,40 +395,58 @@ struct BarrierVisitor : public boost::bfs_visitor<> { auto *dstAccess = access.nextSubpass; auto &blockBarrier = barrierMap[u].blockBarrier; auto &barriers = barrierMap[u].subpassBarriers; - if (!barriers.empty()) { - return; - } - uint32_t subpassIndex = 1; + + uint32_t srcSubpass = 0; + uint32_t dstSubpass = 1; bool isAdjacent = true; // subpass always adjacent to each other if (dstAccess) { + if (!dstAccess->nextSubpass) { + return; + } // subpass at least two passes inside. // the very first pass becomes attachment status collection of all subpass CC_ASSERT(dstAccess->nextSubpass); srcAccess = dstAccess; dstAccess = dstAccess->nextSubpass; - barriers.emplace_back(); } - while (dstAccess) { - barriers.emplace_back(); - CC_ASSERT(barriers.size() == subpassIndex + 1); - // 2 barriers at least when subpass exist - std::vector &srcRearBarriers = barriers[subpassIndex - 1].rearBarriers; - std::vector &dstFrontBarriers = barriers[subpassIndex].frontBarriers; - - AccessNodeInfo from = {srcAccess->attachmentStatus, srcRearBarriers, u}; - AccessNodeInfo to = {dstAccess->attachmentStatus, dstFrontBarriers, u}; - std::set noUseSet; - fillBarrier(from, to, isAdjacent, noUseSet); - - srcAccess = dstAccess; - dstAccess = dstAccess->nextSubpass; + while (srcAccess) { + while (dstAccess) { + // 2 barriers at least when subpass exist + std::vector &srcRearBarriers = barriers[srcSubpass].rearBarriers; + std::vector &dstFrontBarriers = barriers[dstSubpass].frontBarriers; + + AccessNodeInfo from = {srcAccess->attachmentStatus, srcRearBarriers, u, srcSubpass}; + AccessNodeInfo to = {dstAccess->attachmentStatus, dstFrontBarriers, u, dstSubpass}; + std::set noUseSet; + fillBarrier(from, to, isAdjacent, noUseSet); + + dstAccess = dstAccess->nextSubpass; + ++dstSubpass; + } + srcAccess = srcAccess->nextSubpass; + if (srcAccess) { + dstAccess = srcAccess->nextSubpass; + ++srcSubpass; + dstSubpass = srcSubpass + 1; + } } + } + + void discover_vertex(Vertex u, const Graph &g) { + processVertex(u, g); + } - // last vertex front block barrier - if (!out_degree(u, g)) { - auto &rearBarriers = barrierMap[u].blockBarrier.rearBarriers; - auto &frontBarriers = barrierMap[u].blockBarrier.frontBarriers; - for (const auto &barriers : barrierMap[u].subpassBarriers) { + void finish_vertex(Vertex u, const Graph &g) { + auto &rearBarriers = barrierMap[u].blockBarrier.rearBarriers; + auto &frontBarriers = barrierMap[u].blockBarrier.frontBarriers; + Barrier *lastSubpassBarrier = nullptr; + uint32_t subpassIdx{0}; + for (const auto &barriers : barrierMap[u].subpassBarriers) { + if (!barriers.frontBarriers.empty()) { + auto &subpassDependencies = rpInfos.at(u).rpInfo.dependencies; + auto dependency = gfx::SubpassDependency{}; + dependency.srcSubpass = INVALID_ID; + dependency.dstSubpass = subpassIdx; for (const auto &barrier : barriers.frontBarriers) { auto resID = barrier.resourceID; auto findBarrierByResID = [resID](const Barrier &barrier) { @@ -425,16 +457,98 @@ struct BarrierVisitor : public boost::bfs_visitor<> { auto innerResIter = std::find_if(rearBarriers.begin(), rearBarriers.end(), findBarrierByResID); if (firstMeetIter == frontBarriers.end() && innerResIter == rearBarriers.end() && resFinalPassID >= u) { - frontBarriers.emplace_back(barrier); + auto &collect = frontBarriers.emplace_back(barrier); + collect.beginStatus.vertID = collect.endStatus.vertID = u; + } + if ((barrier.beginStatus.vertID > dependency.srcSubpass) && (barrier.beginStatus.vertID != INVALID_ID)) { + dependency.srcSubpass = barrier.beginStatus.vertID; + } + + const auto &desc = get(ResourceGraph::DescTag{}, resourceGraph, resID); + if (desc.format == gfx::Format::DEPTH_STENCIL || desc.format == gfx::Format::DEPTH) { + if (g.access.at(u).attachmentStatus.size() > 1 && dependency.srcSubpass != INVALID_ID) { + auto &dsDep = subpassDependencies.emplace_back(); + dsDep.srcSubpass = dependency.srcSubpass; + dsDep.dstSubpass = dependency.dstSubpass; + dsDep.prevAccesses.emplace_back(barrier.beginStatus.accessFlag); + dsDep.nextAccesses.emplace_back(barrier.endStatus.accessFlag); + } + } else { + bool isWriteAccess = barrier.endStatus.accessFlag > gfx::AccessFlagBit::PRESENT; + if (isWriteAccess && dependency.srcSubpass != INVALID_ID) { + auto &dep = subpassDependencies.emplace_back(); + dep.srcSubpass = dependency.srcSubpass; + dep.dstSubpass = dependency.dstSubpass; + dep.prevAccesses.emplace_back(barrier.beginStatus.accessFlag); + dep.nextAccesses.emplace_back(barrier.endStatus.accessFlag); + } else { + dependency.prevAccesses.emplace_back(barrier.beginStatus.accessFlag); + dependency.nextAccesses.emplace_back(barrier.endStatus.accessFlag); + } + } + } + if (!dependency.prevAccesses.empty() && dependency.srcSubpass != INVALID_ID) { + subpassDependencies.emplace_back(dependency); + } + } + + if (!barriers.rearBarriers.empty()) { + auto &subpassDependencies = rpInfos.at(u).rpInfo.dependencies; + auto dependency = gfx::SubpassDependency{}; + dependency.srcSubpass = subpassIdx; + dependency.dstSubpass = INVALID_ID; + for (const auto &barrier : barriers.rearBarriers) { + if (barrier.endStatus.vertID < dependency.dstSubpass) { + dependency.dstSubpass = barrier.endStatus.vertID; + } + + auto resID = barrier.resourceID; + const auto &desc = get(ResourceGraph::DescTag{}, resourceGraph, resID); + if (desc.format == gfx::Format::DEPTH_STENCIL || desc.format == gfx::Format::DEPTH) { + if (g.access.at(u).attachmentStatus.size() > 1) { + auto &dsDep = subpassDependencies.emplace_back(); + dsDep.srcSubpass = dependency.srcSubpass; + dsDep.dstSubpass = dependency.dstSubpass; + dsDep.prevAccesses.emplace_back(barrier.beginStatus.accessFlag); + dsDep.nextAccesses.emplace_back(barrier.endStatus.accessFlag); + } + } else { + bool isWriteAccess = barrier.endStatus.accessFlag < gfx::AccessFlagBit::PRESENT; + if (isWriteAccess) { + auto &dep = subpassDependencies.emplace_back(); + dep.srcSubpass = dependency.srcSubpass; + dep.dstSubpass = dependency.dstSubpass; + dep.prevAccesses.emplace_back(barrier.beginStatus.accessFlag); + dep.nextAccesses.emplace_back(barrier.endStatus.accessFlag); + } else { + dependency.prevAccesses.emplace_back(barrier.beginStatus.accessFlag); + dependency.nextAccesses.emplace_back(barrier.endStatus.accessFlag); + } } } + if (!dependency.prevAccesses.empty()) { + subpassDependencies.emplace_back(dependency); + } } + ++subpassIdx; } } void fillBarrier(const AccessNodeInfo &from, const AccessNodeInfo &to, bool isAdjacent, std::set &subpassResourceSet) { - const auto &[srcStatus, srcRearBarriers, srcVert] = from; - const auto &[dstStatus, dstFrontBarriers, dstVert] = to; + const auto &[srcStatus, srcRearBarriers, srcPassVert, srcHasSubpass] = from; + const auto &[dstStatus, dstFrontBarriers, dstPassVert, dstHasSubpass] = to; + auto srcVert = srcPassVert; + auto dstVert = dstPassVert; + bool subToSubDeps = false; + if (srcPassVert == dstPassVert) { + srcVert = srcHasSubpass; + dstVert = dstHasSubpass; + subToSubDeps = true; + } + + bool dstExternalDeps = (srcHasSubpass != INVALID_ID) && (dstHasSubpass == INVALID_ID); + bool srcExternalDeps = (srcHasSubpass == INVALID_ID) && (dstHasSubpass != INVALID_ID); + std::vector commonResources; std::set_intersection(srcStatus.begin(), srcStatus.end(), dstStatus.begin(), dstStatus.end(), @@ -470,11 +584,20 @@ struct BarrierVisitor : public boost::bfs_visitor<> { auto srcBarrierIter = srcRearBarriers.empty() ? srcRearBarriers.end() : std::find_if(srcRearBarriers.begin(), srcRearBarriers.end(), findBarrierNodeByResID); auto dstBarrierIter = dstFrontBarriers.empty() ? dstFrontBarriers.end() : std::find_if(dstFrontBarriers.begin(), dstFrontBarriers.end(), findBarrierNodeByResID); + auto dstVertDistribute = [&](uint32_t &vertID, bool depends) { + if (depends) { + vertID = INVALID_ID; + } else if (subToSubDeps) { + vertID = dstVert; + } else { + vertID = isAdjacent ? srcVert : dstVert; + } + }; if (srcBarrierIter == srcRearBarriers.end()) { auto srcAccess = (*fromIter); - srcAccess.vertID = srcVert; + srcAccess.vertID = dstExternalDeps ? INVALID_ID : srcVert; auto dstAccess = (*toIter); - dstAccess.vertID = isAdjacent ? srcVert : dstVert; + dstVertDistribute(dstAccess.vertID, dstExternalDeps); srcRearBarriers.emplace_back(Barrier{ resourceID, @@ -488,19 +611,28 @@ struct BarrierVisitor : public boost::bfs_visitor<> { if (isAdjacent) { srcBarrierIter->type = gfx::BarrierType::FULL; auto srcAccess = (*fromIter); - srcAccess.vertID = srcVert; + srcAccess.vertID = dstExternalDeps ? INVALID_ID : srcVert; srcBarrierIter->beginStatus = srcAccess; auto dstAccess = (*toIter); - dstAccess.vertID = dstVert; + dstVertDistribute(dstAccess.vertID, dstExternalDeps); srcBarrierIter->endStatus = dstAccess; } else { - if (srcVert >= srcBarrierIter->beginStatus.vertID) { + auto &blockBarrier = barrierMap.at(srcPassVert).blockBarrier; + auto lastVert = srcBarrierIter->beginStatus.vertID; + auto blockIter = blockBarrier.rearBarriers.end(); + if (subToSubDeps) { + blockIter = std::find_if(blockBarrier.rearBarriers.begin(), blockBarrier.rearBarriers.end(), findBarrierNodeByResID); + lastVert = blockIter->beginStatus.vertID; + } + if (srcVert >= lastVert) { auto srcAccess = (*fromIter); srcAccess.vertID = srcVert; - srcBarrierIter->beginStatus = srcAccess; + if (blockIter != blockBarrier.rearBarriers.end()) { + blockIter->beginStatus = srcAccess; + } - uint32_t siblingPass = srcBarrierIter->beginStatus.vertID; - if (srcVert > srcBarrierIter->beginStatus.vertID) { + uint32_t siblingPass = lastVert; + if (srcVert > lastVert) { auto &siblingPassBarrier = barrierMap[siblingPass].blockBarrier.rearBarriers; auto siblingIter = std::find_if(siblingPassBarrier.begin(), siblingPassBarrier.end(), [resourceID](const Barrier &barrier) { @@ -513,11 +645,11 @@ struct BarrierVisitor : public boost::bfs_visitor<> { } } - auto srcAccess = (*fromIter); - srcAccess.vertID = srcVert; - auto dstAccess = (*toIter); - dstAccess.vertID = dstVert; if (srcBarrierIter->type == gfx::BarrierType::SPLIT_BEGIN) { + auto srcAccess = (*fromIter); + srcAccess.vertID = srcExternalDeps ? INVALID_ID : srcVert; + auto dstAccess = (*toIter); + dstVertDistribute(dstAccess.vertID, dstExternalDeps); if (dstBarrierIter == dstFrontBarriers.end()) { // if isAdjacent, full barrier already in src rear barriers. if (!isAdjacent) { @@ -550,8 +682,15 @@ struct BarrierVisitor : public boost::bfs_visitor<> { // 2 and 5 read from ResA, 6 writes to ResA // 5 and 6 logically adjacent but not adjacent in execution order. // barrier for ResA between 2 - 6 can be totally replaced by 5 - 6 - if (dstVert <= dstBarrierIter->endStatus.vertID) { - uint32_t siblingPass = dstBarrierIter->endStatus.vertID; + auto &blockBarrier = barrierMap.at(dstPassVert).blockBarrier; + auto blockIter = blockBarrier.frontBarriers.end(); + auto lastVert = dstBarrierIter->endStatus.vertID; + if (subToSubDeps) { + blockIter = std::find_if(blockBarrier.frontBarriers.begin(), blockBarrier.frontBarriers.end(), findBarrierNodeByResID); + lastVert = blockIter->endStatus.vertID; + } + if (dstVert <= lastVert) { + uint32_t siblingPass = lastVert; dstBarrierIter->endStatus = dstAccess; // remove the further redundant barrier @@ -645,9 +784,6 @@ struct BarrierVisitor : public boost::bfs_visitor<> { Vertex from = source(e, g); Vertex to = target(e, g); - processVertex(from, g); - processVertex(to, g); - // hasSubpass ? fromAccess is a single node with all attachment status stored in 'attachmentStatus' // : fromAccess is head of chain of subpasses, which stores all attachment status in 'attachmentStatus' const ResourceAccessNode &fromAccess = get(ResourceAccessGraph::AccessNodeTag{}, g, from); @@ -682,8 +818,8 @@ struct BarrierVisitor : public boost::bfs_visitor<> { while (dstHead) { const std::vector &toStatus = dstHead->attachmentStatus; std::vector &dstFrontBarriers = dstHasSubpass ? barrierMap[to].subpassBarriers[dstSubpassIndex].frontBarriers : barrierMap[to].blockBarrier.frontBarriers; - AccessNodeInfo fromInfo = {fromStatus, srcRearBarriers, from}; - AccessNodeInfo toInfo = {toStatus, dstFrontBarriers, to}; + AccessNodeInfo fromInfo = {fromStatus, srcRearBarriers, from, srcHasSubpass ? static_cast(reverseSubpassQ.size()) : INVALID_ID}; + AccessNodeInfo toInfo = {toStatus, dstFrontBarriers, to, dstHasSubpass ? dstSubpassIndex : INVALID_ID}; bool isExecAdjacent = isAdjacent && (!srcHead->nextSubpass && !dstSubpassIndex); fillBarrier(fromInfo, toInfo, isAdjacent, subpassResourceSet); dstHead = dstHead->nextSubpass; @@ -738,12 +874,17 @@ struct BarrierVisitor : public boost::bfs_visitor<> { srcHead = srcHead->nextSubpass; } + // laterUse: in case it's a split begin/end. const auto &srcAccess = laterUse ? barrier.endStatus : barrier.beginStatus; if (isTransitionStatusDependent(srcAccess, *dstAccess)) { if (iter == rearBarriers.end()) { - rearBarriers.emplace_back(barrier); - } else if (barrier.endStatus.vertID >= dstAccess->vertID) { + auto &collect = rearBarriers.emplace_back(barrier); + collect.beginStatus.vertID = from; + collect.endStatus.vertID = isAdjacent ? from : to; + } else if (iter->endStatus.vertID >= to) { (*iter) = barrier; + iter->beginStatus.vertID = from; + iter->endStatus.vertID = isAdjacent ? from : to; } } } @@ -762,9 +903,8 @@ struct BarrierVisitor : public boost::bfs_visitor<> { frontBarriers.emplace_back(barrier); } } - - subpassIdx++; } + subpassIdx++; } const AccessTable &accessRecord; @@ -773,6 +913,7 @@ struct BarrierVisitor : public boost::bfs_visitor<> { ExternalResMap &externalMap; // last frame to curr frame status transition ResourceNames &resourceNames; // record those which been written ResourceLifeRecordMap &resourceLifeRecord; + PmrFlatMap &rpInfos; }; void buildBarriers(FrameGraphDispatcher &fgDispatcher) { @@ -801,43 +942,66 @@ void buildBarriers(FrameGraphDispatcher &fgDispatcher) { ccstd::set firstMeet; for (size_t i = 0; i < rag.access.size(); ++i) { const auto *status = &rag.access[i]; - while (status) { - for (const auto &attachment : status->attachmentStatus) { - AccessStatus lastStatus{ - static_cast(i), - gfx::ShaderStageFlagBit::NONE, - gfx::MemoryAccessBit::NONE, - gfx::PassType::RASTER, - gfx::AccessFlagBit::NONE, - gfx::TextureUsageBit::NONE, - TextureRange{}, - }; + for (const auto &attachment : status->attachmentStatus) { + AccessStatus lastStatus{ + static_cast(i), + gfx::ShaderStageFlagBit::NONE, + gfx::MemoryAccessBit::NONE, + gfx::PassType::RASTER, + gfx::AccessFlagBit::NONE, + gfx::TextureUsageBit::NONE, + TextureRange{}, + }; - AccessStatus currStatus = attachment; - currStatus.vertID = static_cast(i); + AccessStatus currStatus = attachment; + currStatus.vertID = static_cast(i); - gfx::BarrierType bType = gfx::BarrierType::FULL; - const auto &traits = get(ResourceGraph::TraitsTag{}, resourceGraph, attachment.vertID); - if (traits.hasSideEffects()) { - const auto &accessFlag = get(ResourceGraph::StatesTag{}, resourceGraph, attachment.vertID).states; - if (accessFlag != gfx::AccessFlagBit::NONE) { - lastStatus.accessFlag = accessFlag; - bType = traits.residency == ResourceResidency::BACKBUFFER ? gfx::BarrierType::FULL : gfx::BarrierType::SPLIT_END; - } - if (!isTransitionStatusDependent(lastStatus, currStatus)) { - continue; - } + gfx::BarrierType bType = gfx::BarrierType::FULL; + const auto &traits = get(ResourceGraph::TraitsTag{}, resourceGraph, attachment.vertID); + if (traits.hasSideEffects()) { + const auto &accessFlag = get(ResourceGraph::StatesTag{}, resourceGraph, attachment.vertID).states; + if (accessFlag != gfx::AccessFlagBit::NONE) { + lastStatus.accessFlag = accessFlag; + bType = traits.residency == ResourceResidency::BACKBUFFER ? gfx::BarrierType::FULL : gfx::BarrierType::SPLIT_END; } - if (firstMeet.find(attachment.vertID) == firstMeet.end()) { - firstMeet.emplace(attachment.vertID); - - if (batchedBarriers.find(i) == batchedBarriers.end()) { - batchedBarriers.emplace(i, BarrierNode{}); + if (!isTransitionStatusDependent(lastStatus, currStatus)) { + continue; + } + } + if (firstMeet.find(attachment.vertID) == firstMeet.end()) { + firstMeet.emplace(attachment.vertID); + + if (batchedBarriers.find(i) == batchedBarriers.end()) { + batchedBarriers.emplace(i, BarrierNode{}); + auto &rpInfo = rag.rpInfos[i].rpInfo; + if (rpInfo.subpasses.size() > 1) { + batchedBarriers[i].subpassBarriers.resize(rpInfo.subpasses.size()); } + } - auto &blockFrontBarrier = batchedBarriers.at(i).blockBarrier.frontBarriers; - auto resIter = std::find_if(blockFrontBarrier.begin(), blockFrontBarrier.end(), [&attachment](const Barrier &barrier) { return barrier.resourceID == attachment.vertID; }); - if (resIter == blockFrontBarrier.end()) { + auto &blockFrontBarrier = batchedBarriers.at(i).blockBarrier.frontBarriers; + auto resIter = std::find_if(blockFrontBarrier.begin(), blockFrontBarrier.end(), [&attachment](const Barrier &barrier) { return barrier.resourceID == attachment.vertID; }); + if (resIter == blockFrontBarrier.end()) { + Barrier firstMeetBarrier{ + attachment.vertID, + bType, + nullptr, + lastStatus, + currStatus, + }; + blockFrontBarrier.emplace_back(firstMeetBarrier); + } + auto *nextStatus = status->nextSubpass; + uint32_t index = 0; + while (nextStatus) { + const auto &subpassStatus = nextStatus->attachmentStatus; + auto &subpassBarriers = batchedBarriers.at(i).subpassBarriers; + auto &frontBarriers = subpassBarriers[index].frontBarriers; + auto iter = std::find_if(subpassStatus.begin(), subpassStatus.end(), [&attachment](const AccessStatus &access) { return access.vertID == attachment.vertID; }); + if (iter != subpassStatus.end()) { + lastStatus.vertID = 0xFFFFFFFF; + currStatus.vertID = index; + currStatus.accessFlag = iter->accessFlag; Barrier firstMeetBarrier{ attachment.vertID, bType, @@ -845,11 +1009,13 @@ void buildBarriers(FrameGraphDispatcher &fgDispatcher) { lastStatus, currStatus, }; - blockFrontBarrier.emplace_back(firstMeetBarrier); + frontBarriers.emplace_back(firstMeetBarrier); + break; } + nextStatus = nextStatus->nextSubpass; + index++; } } - status = status->nextSubpass; } } } @@ -857,7 +1023,7 @@ void buildBarriers(FrameGraphDispatcher &fgDispatcher) { ResourceNames namesSet; { // barrier between passes - BarrierVisitor visitor(resourceGraph, batchedBarriers, externalResMap, namesSet, rag.accessRecord, rag.resourceLifeRecord); + BarrierVisitor visitor(resourceGraph, batchedBarriers, externalResMap, namesSet, rag.accessRecord, rag.resourceLifeRecord, rag.rpInfos); auto colors = rag.colors(scratch); boost::queue q; @@ -916,7 +1082,7 @@ void buildBarriers(FrameGraphDispatcher &fgDispatcher) { rescStates.states = gfx::AccessFlagBit::PRESENT; } - bool hasSubpass = !batchedBarriers[passID].subpassBarriers.empty(); + bool hasSubpass = !(batchedBarriers[passID].subpassBarriers.size() <= 1); if (hasSubpass) { auto &subpassBarriers = batchedBarriers[passID].subpassBarriers; for (int i = static_cast(subpassBarriers.size()) - 1; i >= 0; --i) { @@ -977,6 +1143,21 @@ void buildBarriers(FrameGraphDispatcher &fgDispatcher) { genGFXBarrier(subpassBarrier.rearBarriers); } } + + { + for (auto &[vert, fgRenderpassInfo] : rag.rpInfos) { + auto &colorAttachments = fgRenderpassInfo.rpInfo.colorAttachments; + for (uint32_t i = 0; i < colorAttachments.size(); ++i) { + const auto &colorAccess = fgRenderpassInfo.colorAccesses[i]; + colorAttachments[i].barrier = getGeneralBarrier(cc::gfx::Device::getInstance(), colorAccess.first, colorAccess.second); + } + auto &dsAttachment = fgRenderpassInfo.rpInfo.depthStencilAttachment; + if (dsAttachment.format != gfx::Format::UNKNOWN) { + const auto &dsAccess = fgRenderpassInfo.dsAccess; + dsAttachment.barrier = getGeneralBarrier(cc::gfx::Device::getInstance(), dsAccess.first, dsAccess.second); + } + } + } } #pragma endregion BUILD_BARRIERS @@ -1534,8 +1715,7 @@ bool tryAddEdge(uint32_t srcVertex, uint32_t dstVertex, Graph &graph) { } bool isTransitionStatusDependent(const AccessStatus &lhs, const AccessStatus &rhs) { - return (!(isReadOnlyAccess(lhs.accessFlag) && isReadOnlyAccess(rhs.accessFlag))) && - (lhs.accessFlag != rhs.accessFlag); + return !(isReadOnlyAccess(lhs.accessFlag) && isReadOnlyAccess(rhs.accessFlag)); } auto mapTextureFlags(ResourceFlags flags) { @@ -1658,10 +1838,13 @@ void addCopyAccessStatus(RAG &rag, const ResourceGraph &rg, ResourceAccessNode & }); } -void addAccessStatus(RAG &rag, const ResourceGraph &rg, ResourceAccessNode &node, const ViewStatus &status) { +PmrString addAccessStatus(RAG &rag, const ResourceGraph &rg, ResourceAccessNode &node, const ViewStatus &status) { const auto &[name, passType, visibility, access, accessFlag, usage] = status; uint32_t rescID = rg.valueIndex.at(name); const auto &resourceDesc = get(ResourceGraph::DescTag{}, rg, rescID); + const auto &traits = get(ResourceGraph::TraitsTag{}, rg, rescID); + // const PmrString *resName = &name; + Range range; if (resourceDesc.dimension == ResourceDimension::BUFFER) { range = BufferRange{0, resourceDesc.width}; @@ -1684,6 +1867,7 @@ void addAccessStatus(RAG &rag, const ResourceGraph &rg, ResourceAccessNode &node usage, range, }); + return name; } AccessVertex dependencyCheck(RAG &rag, AccessVertex curVertID, const ResourceGraph &rg, const ViewStatus &viewStatus) { @@ -1842,50 +2026,115 @@ bool checkComputeViews(const Graphs &graphs, uint32_t vertID, uint32_t passID, P return dependent; } +void fillRenderPassInfo(const RasterView &view, gfx::RenderPassInfo &rpInfo, uint32_t index, const ResourceDesc &viewDesc) { + if (view.attachmentType != AttachmentType::DEPTH_STENCIL) { + auto &colorAttachment = rpInfo.colorAttachments[index]; + colorAttachment.format = viewDesc.format; + colorAttachment.loadOp = view.loadOp; + colorAttachment.storeOp = view.storeOp; + colorAttachment.sampleCount = viewDesc.sampleCount; + colorAttachment.isGeneralLayout = gfx::hasFlag(viewDesc.textureFlags, gfx::TextureFlags::GENERAL_LAYOUT); + // colorAttachment.barrier = getGeneralBarrier(gfx::Device::getInstance(), view, prevAccess, nextAccess); + } else { + auto &depthStencilAttachment = rpInfo.depthStencilAttachment; + depthStencilAttachment.format = viewDesc.format; + depthStencilAttachment.depthLoadOp = view.loadOp; + depthStencilAttachment.depthStoreOp = view.storeOp; + depthStencilAttachment.stencilLoadOp = view.loadOp; + depthStencilAttachment.stencilStoreOp = view.storeOp; + depthStencilAttachment.sampleCount = viewDesc.sampleCount; + depthStencilAttachment.isGeneralLayout = gfx::hasFlag(viewDesc.textureFlags, gfx::TextureFlags::GENERAL_LAYOUT); + // depthStencilAttachment.barrier = getGeneralBarrier(gfx::Device::getInstance(), view, prevAccess, nextAccess); + } +} + void processRasterPass(const Graphs &graphs, uint32_t passID, const RasterPass &pass) { const auto &[renderGraph, resourceGraph, layoutGraphData, resourceAccessGraph, relationGraph] = graphs; auto vertID = add_vertex(resourceAccessGraph, passID); auto rlgVertID = add_vertex(relationGraph, vertID); CC_EXPECTS(static_cast(rlgVertID) == static_cast(vertID)); - auto &node = get(RAG::AccessNodeTag{}, resourceAccessGraph, vertID); - const auto &subpasses = get(SubpassGraph::SubpassTag{}, pass.subpassGraph); - bool hasSubpass = !subpasses.container->empty(); - bool dependent = false; - if (hasSubpass) { - auto *lastNode = &node; - for (const auto &subpass : (*subpasses.container)) { - lastNode->nextSubpass = new ResourceAccessNode; - auto *head = lastNode->nextSubpass; - - dependent |= checkRasterViews(graphs, vertID, passID, PassType::RASTER, *head, subpass.rasterViews); - dependent |= checkComputeViews(graphs, vertID, passID, PassType::RASTER, *head, subpass.computeViews); - - for (auto &attachment : head->attachmentStatus) { - auto resID = attachment.vertID; - auto findByResID = [resID](const AccessStatus &status) { - return status.vertID == resID; - }; + const auto &subpasses = pass.subpassGraph.subpasses; + bool hasSubpass = !subpasses.empty(); + auto &fgRenderpassInfo = resourceAccessGraph.rpInfos.emplace(vertID, FGRenderPassInfo{}).first->second; + auto &rpInfo = fgRenderpassInfo.rpInfo; + if (!hasSubpass) { + auto &rag = resourceAccessGraph; + auto size = std::count_if(pass.rasterViews.begin(), pass.rasterViews.end(), [](const auto &pair) { + return pair.second.attachmentType != AttachmentType::DEPTH_STENCIL; + }); + rpInfo.colorAttachments.resize(size); + fgRenderpassInfo.colorAccesses.resize(size); + PmrFlatMap> viewIndex(rag.get_allocator()); + for (const auto &[name, view] : pass.rasterViews) { + auto resIter = rag.resourceIndex.find(name); + gfx::AccessFlags prevAccess = resIter == rag.resourceIndex.end() ? gfx::AccessFlags::NONE : rag.accessRecord.at(resIter->second).currStatus.accessFlag; + viewIndex.emplace(std::piecewise_construct, std::forward_as_tuple(view.slotID), std::forward_as_tuple(name, prevAccess)); + } + + bool dependent = false; + dependent |= checkRasterViews(graphs, vertID, passID, PassType::RASTER, node, pass.rasterViews); + dependent |= checkComputeViews(graphs, vertID, passID, PassType::RASTER, node, pass.computeViews); + + if (!dependent) { + tryAddEdge(EXPECT_START_ID, vertID, resourceAccessGraph); + tryAddEdge(EXPECT_START_ID, rlgVertID, relationGraph); + } - auto iter = std::find_if(node.attachmentStatus.begin(), node.attachmentStatus.end(), findByResID); - if (iter == node.attachmentStatus.end()) { - node.attachmentStatus.emplace_back(attachment); - iter = std::prev(node.attachmentStatus.end()); + uint32_t index = 0; + // initial layout(accessrecord.laststatus) and final layout(accessrecord.currstatus) can be filled here + for (const auto &[slotID, pair] : viewIndex) { + const auto &name = pair.first; + const auto resID = rag.resourceIndex.at(name); + const auto &view = pass.rasterViews.at(name); + const auto &viewDesc = get(ResourceGraph::DescTag{}, resourceGraph, resID); + auto prevAccess = pair.second; + CC_ASSERT(slotID < node.attachmentStatus.size()); + // TD:remove find + auto nodeIter = std::find_if(node.attachmentStatus.begin(), node.attachmentStatus.end(), [resID](const AccessStatus &status) { + return status.vertID == resID; + }); + auto nextAccess = nodeIter->accessFlag; + + if (rpInfo.subpasses.empty()) { + rpInfo.subpasses.emplace_back(); + } + auto &subpassInfo = rpInfo.subpasses.front(); + if (view.attachmentType != AttachmentType::DEPTH_STENCIL) { + if (view.attachmentType == AttachmentType::SHADING_RATE) { + subpassInfo.shadingRate = index; } else { - (*iter) = attachment; + if (view.accessType != AccessType::READ) { + subpassInfo.colors.emplace_back(index); + } + if (view.accessType != AccessType::WRITE) { + subpassInfo.inputs.emplace_back(index); + } } + fgRenderpassInfo.colorAccesses[index].first = prevAccess; + fgRenderpassInfo.colorAccesses[index].second = nextAccess; + } else { + subpassInfo.depthStencil = pass.rasterViews.size() - 1; + fgRenderpassInfo.dsAccess.first = prevAccess; + fgRenderpassInfo.dsAccess.second = nextAccess; } - lastNode = head; + fillRenderPassInfo(view, rpInfo, index, viewDesc); } } else { - dependent |= checkRasterViews(graphs, vertID, passID, PassType::RASTER, node, pass.rasterViews); - dependent |= checkComputeViews(graphs, vertID, passID, PassType::RASTER, node, pass.computeViews); - } - - if (!dependent) { - tryAddEdge(EXPECT_START_ID, vertID, resourceAccessGraph); - tryAddEdge(EXPECT_START_ID, rlgVertID, relationGraph); + PmrFlatSet viewSet(resourceAccessGraph.get_allocator()); + bool hasDS{false}; + for (const auto &subpass : pass.subpassGraph.subpasses) { + for (const auto &pair : subpass.rasterViews) { + if (pair.second.attachmentType != AttachmentType::DEPTH_STENCIL) { + viewSet.emplace(pair.first); + } else { + hasDS = true; + } + } + } + rpInfo.colorAttachments.resize(viewSet.size()); + fgRenderpassInfo.colorAccesses.resize(viewSet.size()); } } @@ -1904,6 +2153,128 @@ void processComputePass(const Graphs &graphs, uint32_t passID, const ComputePass } } +void processRasterSubpass(const Graphs &graphs, uint32_t passID, const RasterSubpass &pass) { + const auto &[renderGraph, resourceGraph, layoutGraphData, resourceAccessGraph, relationGraph] = graphs; + const auto &obj = renderGraph.objects.at(passID); + const auto parentID = obj.parents.front().target; + const auto parentRagVert = resourceAccessGraph.passIndex.at(parentID); + const auto *parentPass = get_if(parentID, &renderGraph); + CC_EXPECTS(parentPass); + const auto &rag = resourceAccessGraph; + const auto &resg = resourceGraph; + const auto &uberPass = *parentPass; + + resourceAccessGraph.passIndex[passID] = parentRagVert; + + uint32_t dsIndex = INVALID_ID; + PmrFlatMap> viewIndex(rag.get_allocator()); + for (const auto &[name, view] : pass.rasterViews) { + auto resIter = rag.resourceIndex.find(name); + gfx::AccessFlags prevAccess = resIter == rag.resourceIndex.end() ? gfx::AccessFlags::NONE : rag.accessRecord.at(resIter->second).currStatus.accessFlag; + viewIndex.emplace(std::piecewise_construct, std::forward_as_tuple(view.slotID), std::forward_as_tuple(name, prevAccess)); + } + + auto &node = get(RAG::AccessNodeTag{}, resourceAccessGraph, parentRagVert); + auto &fgRenderpassInfo = resourceAccessGraph.rpInfos.at(parentRagVert); + auto &rpInfo = fgRenderpassInfo.rpInfo; + auto &subpassInfo = rpInfo.subpasses.emplace_back(); + auto *lastNode = &node; + while (lastNode->nextSubpass) { + lastNode = lastNode->nextSubpass; + } + lastNode->nextSubpass = new ResourceAccessNode; + auto *head = lastNode->nextSubpass; + bool dependent{false}; + dependent |= checkRasterViews(graphs, parentRagVert, passID, PassType::RASTER, *head, pass.rasterViews); + dependent |= checkComputeViews(graphs, parentRagVert, passID, PassType::RASTER, *head, pass.computeViews); + + if (!dependent) { + tryAddEdge(EXPECT_START_ID, parentRagVert, resourceAccessGraph); + tryAddEdge(EXPECT_START_ID, parentRagVert, relationGraph); + } + + for (const auto &[slotID, pair] : viewIndex) { + const auto &resName = pair.first; + auto findByResID = [&](const AccessStatus &status) { + return status.vertID == rag.resourceIndex.at(resName); + }; + auto iter = std::find_if(node.attachmentStatus.begin(), node.attachmentStatus.end(), findByResID); + const auto &view = pass.rasterViews.at(resName); + auto resID = rag.resourceIndex.at(resName); + const auto &viewDesc = get(ResourceGraph::DescTag{}, resg, rag.resourceIndex.at(resName)); + auto slot = slotID > dsIndex ? slotID - 1 : slotID; + // TD:remove find + auto nodeIter = std::find_if(head->attachmentStatus.begin(), head->attachmentStatus.end(), [resID](const AccessStatus &status) { + return status.vertID == resID; + }); + auto nextAccess = nodeIter->accessFlag; + if (view.attachmentType != AttachmentType::DEPTH_STENCIL) { + if (view.attachmentType == AttachmentType::SHADING_RATE) { + subpassInfo.shadingRate = slot; + } else { + if (view.accessType != AccessType::READ) { + subpassInfo.colors.emplace_back(slot); + } + if (view.accessType != AccessType::WRITE) { + subpassInfo.inputs.emplace_back(slot); + } + } + fgRenderpassInfo.colorAccesses[slot].second = nextAccess; + } else { + dsIndex = slotID; + fgRenderpassInfo.dsAccess.second = nextAccess; + subpassInfo.depthStencil = rpInfo.colorAttachments.size(); + } + + if (iter == node.attachmentStatus.end()) { + auto curIter = std::find_if(head->attachmentStatus.begin(), head->attachmentStatus.end(), findByResID); + node.attachmentStatus.emplace_back(*curIter); + + auto colorIndex = dsIndex == INVALID_ID ? node.attachmentStatus.size() : node.attachmentStatus.size() - 1; + auto prevAccess = pair.second; + CC_ASSERT(head->attachmentStatus.size() > slotID); + auto nextAccess = head->attachmentStatus[slot].accessFlag; + + if (view.attachmentType == AttachmentType::DEPTH_STENCIL) { + fgRenderpassInfo.dsAccess.first = prevAccess; + } else { + fgRenderpassInfo.colorAccesses[slot].first = prevAccess; + } + fillRenderPassInfo(view, rpInfo, slot, viewDesc); + } + } +} + +void processComputeSubpass(const Graphs &graphs, uint32_t passID, const ComputeSubpass &pass) { + const auto &[renderGraph, resourceGraph, layoutGraphData, resourceAccessGraph, relationGraph] = graphs; + const auto &obj = renderGraph.objects.at(passID); + const auto parentID = obj.parents.front().target; + const auto parentRagVert = resourceAccessGraph.passIndex.at(parentID); + const auto *parentPass = get_if(parentID, &renderGraph); + CC_EXPECTS(parentPass); + const auto &rag = resourceAccessGraph; + const auto &resg = resourceGraph; + const auto &uberPass = *parentPass; + + resourceAccessGraph.passIndex[passID] = parentRagVert; + + auto &node = get(RAG::AccessNodeTag{}, resourceAccessGraph, parentRagVert); + + auto *lastNode = &node; + while (lastNode->nextSubpass) { + lastNode = lastNode->nextSubpass; + } + lastNode->nextSubpass = new ResourceAccessNode; + auto *head = lastNode->nextSubpass; + + bool dependent = checkComputeViews(graphs, parentRagVert, passID, PassType::COMPUTE, *head, pass.computeViews); + + if (!dependent) { + tryAddEdge(EXPECT_START_ID, parentRagVert, resourceAccessGraph); + tryAddEdge(EXPECT_START_ID, parentRagVert, relationGraph); + } +} + void processCopyPass(const Graphs &graphs, uint32_t passID, const CopyPass &pass) { const auto &[renderGraph, resourceGraph, layoutGraphData, resourceAccessGraph, relationGraph] = graphs; diff --git a/native/cocos/renderer/pipeline/custom/NativeExecutor.cpp b/native/cocos/renderer/pipeline/custom/NativeExecutor.cpp index d9978585f5e..0e056809d72 100644 --- a/native/cocos/renderer/pipeline/custom/NativeExecutor.cpp +++ b/native/cocos/renderer/pipeline/custom/NativeExecutor.cpp @@ -91,7 +91,9 @@ struct RenderGraphVisitorContext { CustomRenderGraphContext customContext; boost::container::pmr::memory_resource* scratch = nullptr; gfx::RenderPass* currentPass = nullptr; + uint32_t subpassIndex = 0; LayoutGraphData::vertex_descriptor currentPassLayoutID = LayoutGraphData::null_vertex(); + RenderGraph::vertex_descriptor currentInFlightPassID = RenderGraph::null_vertex(); Mat4 currentProjMatrix{}; }; @@ -177,57 +179,25 @@ PersistentRenderPassAndFramebuffer createPersistentRenderPassAndFramebuffer( }; fbInfo.colorTextures.reserve(pass.rasterViews.size()); - if (pass.subpassGraph.subpasses.empty()) { - const auto numInputs = getRasterPassInputCount(pass); - const auto numColors = getRasterPassOutputCount(pass); - - // persistent cache - data.clearColors.reserve(numColors); - - // render pass - rpInfo.colorAttachments.reserve(numColors); - - auto& subpass = rpInfo.subpasses.emplace_back(); - subpass.inputs.reserve(numInputs); - subpass.colors.reserve(numColors); - subpass.resolves.reserve(getRasterPassResolveCount(pass)); - subpass.preserves.reserve(getRasterPassPreserveCount(pass)); + PmrFlatSet set(scratch); + auto fillFrameBufferInfo = [&](const auto& pass) { auto numTotalAttachments = static_cast(pass.rasterViews.size()); PmrFlatMap viewIndex(scratch); for (const auto& [name, view] : pass.rasterViews) { - viewIndex.emplace(view.slotID, name); + if (set.emplace(name).second) { + viewIndex.emplace(view.slotID, name); + } } - uint32_t dsvCount = 0; + // uint32_t dsvCount = 0; + uint32_t index = 0; for (const auto& [slotID, name] : viewIndex) { const auto& view = pass.rasterViews.at(name); const auto resID = vertex(name, ctx.resourceGraph); const auto& desc = get(ResourceGraph::DescTag{}, ctx.resourceGraph, resID); if (view.attachmentType == AttachmentType::RENDER_TARGET || view.attachmentType == AttachmentType::SHADING_RATE) { // RenderTarget - auto slot = static_cast(rpInfo.colorAttachments.size()); - auto& rtv = rpInfo.colorAttachments.emplace_back( - gfx::ColorAttachment{ - desc.format, - desc.sampleCount, - view.loadOp, - view.storeOp, - getGeneralBarrier(ctx.device, view), - hasFlag(desc.textureFlags, gfx::TextureFlags::GENERAL_LAYOUT), - }); - if (view.attachmentType == AttachmentType::SHADING_RATE) { - subpass.shadingRate = slot; - } else { - if (view.accessType != AccessType::WRITE) { // Input - auto inputSlot = getRasterViewPassInputSlot(view); - subpass.inputs.emplace_back(slot); - } - if (view.accessType != AccessType::READ) { // Output - subpass.colors.emplace_back(slot); - } - } - data.clearColors.emplace_back(view.clearColor); auto resID = findVertex(name, resg); @@ -255,53 +225,58 @@ PersistentRenderPassAndFramebuffer createPersistentRenderPassAndFramebuffer( [&](const IntrusivePtr& fb) { CC_EXPECTS(fb->getColorTextures().size() == 1); CC_EXPECTS(fb->getColorTextures().at(0)); - fbInfo.colorTextures.emplace_back(fb->getColorTextures()[slot]); + fbInfo.colorTextures.emplace_back(fb->getColorTextures()[index]); // render window attaches a depthStencil by default, which may differs from renderpassInfo here. // data.framebuffer = fb; }, [&](const RenderSwapchain& sc) { fbInfo.colorTextures.emplace_back(sc.swapchain->getColorTexture()); }); - CC_ENSURES(rpInfo.colorAttachments.size() == data.clearColors.size()); - CC_ENSURES(rpInfo.colorAttachments.size() == fbInfo.colorTextures.size()); } else if (view.attachmentType == AttachmentType::DEPTH_STENCIL) { // DepthStencil - auto& dsv = rpInfo.depthStencilAttachment; - CC_EXPECTS(desc.format != gfx::Format::UNKNOWN); - dsv.format = desc.format; - dsv.sampleCount = desc.sampleCount; - dsv.depthLoadOp = view.loadOp; - dsv.depthStoreOp = view.storeOp; - dsv.stencilLoadOp = view.loadOp; - dsv.stencilStoreOp = view.storeOp; - dsv.barrier = getGeneralBarrier(ctx.device, view); - dsv.isGeneralLayout = hasFlag(desc.textureFlags, gfx::TextureFlags::GENERAL_LAYOUT); - - CC_EXPECTS(numTotalAttachments > 0); - subpass.depthStencil = numTotalAttachments - 1; - data.clearDepth = view.clearColor.x; data.clearStencil = static_cast(view.clearColor.y); - auto resID = findVertex(name, resg); - visitObject( - resID, resg, - [&](const ManagedTexture& tex) { - CC_EXPECTS(tex.texture); - CC_EXPECTS(!fbInfo.depthStencilTexture); - fbInfo.depthStencilTexture = tex.texture.get(); - }, - [&](const IntrusivePtr& tex) { - CC_EXPECTS(!fbInfo.depthStencilTexture); - fbInfo.depthStencilTexture = tex.get(); - }, - [](const auto& /*unused*/) { - CC_EXPECTS(false); - }); + if (!fbInfo.depthStencilTexture) { + auto resID = findVertex(name, resg); + visitObject( + resID, resg, + [&](const ManagedTexture& tex) { + CC_EXPECTS(tex.texture); + CC_EXPECTS(!fbInfo.depthStencilTexture); + fbInfo.depthStencilTexture = tex.texture.get(); + }, + [&](const IntrusivePtr& tex) { + CC_EXPECTS(!fbInfo.depthStencilTexture); + fbInfo.depthStencilTexture = tex.get(); + }, + [](const auto& /*unused*/) { + CC_EXPECTS(false); + }); + } } + ++index; } + }; + + const auto passID = ctx.currentInFlightPassID; + const auto ragVertID = ctx.fgd.resourceAccessGraph.passIndex.at(passID); + if (pass.subpassGraph.subpasses.empty()) { + const auto numInputs = getRasterPassInputCount(pass); + const auto numColors = getRasterPassOutputCount(pass); + + // persistent cache + data.clearColors.reserve(numColors); + rpInfo = ctx.fgd.resourceAccessGraph.rpInfos.at(ragVertID).rpInfo; + fillFrameBufferInfo(pass); + } else { - CC_EXPECTS(false); + rpInfo = ctx.fgd.resourceAccessGraph.rpInfos.at(ragVertID).rpInfo; + for (const auto& subpass : pass.subpassGraph.subpasses) { + fillFrameBufferInfo(subpass); + } } + CC_ENSURES(rpInfo.colorAttachments.size() == data.clearColors.size()); + CC_ENSURES(rpInfo.colorAttachments.size() == fbInfo.colorTextures.size()); data.renderPass = ctx.device->createRenderPass(rpInfo); fbInfo.renderPass = data.renderPass; @@ -632,9 +607,20 @@ gfx::DescriptorSet* initDescriptorSet( bindID += d.count; } break; - case DescriptorTypeOrder::INPUT_ATTACHMENT: - // not supported yet - CC_EXPECTS(false); + case DescriptorTypeOrder::INPUT_ATTACHMENT: { + for (auto d : block.descriptors) { + CC_EXPECTS(d.count == 1); + auto iter = resourceIndex.find(d.descriptorID); + if (iter != resourceIndex.end()) { + // render graph textures + auto* texture = resg.getTexture(iter->second); + CC_ENSURES(texture); + newSet->bindTexture(bindID, texture); + } + bindID += d.count; + } + + }; break; default: CC_EXPECTS(false); @@ -733,8 +719,20 @@ gfx::DescriptorSet* updatePerPassDescriptorSet( CC_EXPECTS(false); break; case DescriptorTypeOrder::INPUT_ATTACHMENT: - // not supported yet - CC_EXPECTS(false); + CC_EXPECTS(newSet); + for (const auto& d : block.descriptors) { + CC_EXPECTS(d.count == 1); + auto iter = user.textures.find(d.descriptorID.value); + if (iter != user.textures.end()) { + newSet->bindTexture(bindID, iter->second.get()); + } else { + auto* prevTexture = prevSet.getTexture(bindID); + if (prevTexture) { + newSet->bindTexture(bindID, prevTexture); + } + } + bindID += d.count; + } break; default: CC_EXPECTS(false); @@ -1045,6 +1043,45 @@ struct RenderGraphUploadVisitor : boost::dfs_visitor<> { const auto& dispatch = get(DispatchTag{}, vertID, ctx.g); auto& pass = *dispatch.material->getPasses()->at(static_cast(dispatch.passID)); uploadBlitOrDispatchUniformBlokcs(vertID, pass); + } else if (holds(vertID, ctx.g)) { + const auto& subpass = get(RasterSubpassTag{}, vertID, ctx.g); + // render pass + const auto& layoutName = get(RenderGraph::LayoutTag{}, ctx.g, vertID); + const auto& layoutID = locate(LayoutGraphData::null_vertex(), layoutName, ctx.lg); + ctx.currentPassLayoutID = layoutID; + // get layout + auto& layout = get(LayoutGraphData::LayoutTag{}, ctx.lg, layoutID); + + // update states + auto iter = layout.descriptorSets.find(UpdateFrequency::PER_PASS); + if (iter == layout.descriptorSets.end()) { + return; + } + + // build pass resources + /* const auto& resourceIndex = buildResourceIndex( + ctx.resourceGraph, ctx.lg, subpass.computeViews, ctx.scratch);*/ + PmrFlatMap resourceIndex(ctx.scratch); + resourceIndex.reserve(subpass.rasterViews.size() * 2); + for (const auto& [resName, rasterView] : subpass.rasterViews) { + const auto resID = vertex(resName, ctx.resourceGraph); + auto iter = ctx.lg.attributeIndex.find(rasterView.slotName); + if (iter != ctx.lg.attributeIndex.end()) { + resourceIndex.emplace(iter->second, resID); + } + } + + // populate set + auto& set = iter->second; + const auto& user = get(RenderGraph::DataTag{}, ctx.g, vertID); + auto& node = ctx.context.layoutGraphResources.at(layoutID); + auto* perPassSet = initDescriptorSet( + ctx.resourceGraph, + ctx.device, ctx.cmdBuff, + *ctx.context.defaultResource, ctx.lg, + resourceIndex, set, user, node); + CC_ENSURES(perPassSet); + ctx.renderGraphDescriptorSet[vertID] = perPassSet; } } @@ -1103,7 +1140,7 @@ struct RenderGraphVisitor : boost::dfs_visitor<> { } const auto& nodeID = iter->second; auto iter2 = ctx.barrierMap.find(nodeID); - if (iter2 != ctx.barrierMap.end()) { + if (iter2 != ctx.barrierMap.end() && iter2->second.subpassBarriers.empty()) { submitBarriers(iter2->second.blockBarrier.frontBarriers); } } @@ -1114,7 +1151,7 @@ struct RenderGraphVisitor : boost::dfs_visitor<> { } const auto& nodeID = iter->second; auto iter2 = ctx.barrierMap.find(nodeID); - if (iter2 != ctx.barrierMap.end()) { + if (iter2 != ctx.barrierMap.end() && iter2->second.subpassBarriers.empty()) { submitBarriers(iter2->second.blockBarrier.rearBarriers); } } @@ -1159,6 +1196,7 @@ struct RenderGraphVisitor : boost::dfs_visitor<> { // render pass { + ctx.currentInFlightPassID = vertID; auto& res = fetchOrCreateFramebuffer(ctx, pass, ctx.scratch); const auto& data = res; auto* cmdBuff = ctx.cmdBuff; @@ -1186,8 +1224,12 @@ struct RenderGraphVisitor : boost::dfs_visitor<> { } } - std::ignore = subpass; - std::ignore = vertID; + // PerPass DescriptorSet + if (subpass.subpassID) { + ctx.cmdBuff->nextSubpass(); + } + tryBindPerPassDescriptorSet(vertID); + ctx.subpassIndex = subpass.subpassID; // noop } void begin(const ComputeSubpass& subpass, RenderGraph::vertex_descriptor vertID) const { // NOLINT(readability-convert-member-functions-to-static) @@ -1357,7 +1399,7 @@ struct RenderGraphVisitor : boost::dfs_visitor<> { auto& shader = *pass.getShaderVariant(); // get pso auto* pso = pipeline::PipelineStateManager::getOrCreatePipelineState( - &pass, &shader, ctx.context.fullscreenQuad.quadIA.get(), ctx.currentPass); + &pass, &shader, ctx.context.fullscreenQuad.quadIA.get(), ctx.currentPass, ctx.subpassIndex); if (!pso) { return; } @@ -1432,6 +1474,7 @@ struct RenderGraphVisitor : boost::dfs_visitor<> { std::ignore = subpass; std::ignore = vertID; + ctx.subpassIndex = 0; // noop } void end(const ComputeSubpass& subpass, RenderGraph::vertex_descriptor vertID) const { // NOLINT(readability-convert-member-functions-to-static) @@ -1504,6 +1547,21 @@ struct RenderGraphVisitor : boost::dfs_visitor<> { } void end(const gfx::Viewport& pass, RenderGraph::vertex_descriptor vertID) const { } + + void mountResources(const Subpass& pass) const { + auto& resg = ctx.resourceGraph; + // mount managed resources + for (const auto& [name, view] : pass.rasterViews) { + auto resID = findVertex(name, resg); + CC_EXPECTS(resID != ResourceGraph::null_vertex()); + resg.mount(ctx.device, resID); + } + for (const auto& [name, views] : pass.computeViews) { + auto resID = findVertex(name, resg); + CC_EXPECTS(resID != ResourceGraph::null_vertex()); + resg.mount(ctx.device, resID); + } + } void mountResources(const RasterPass& pass) const { auto& resg = ctx.resourceGraph; @@ -1518,6 +1576,10 @@ struct RenderGraphVisitor : boost::dfs_visitor<> { CC_EXPECTS(resID != ResourceGraph::null_vertex()); resg.mount(ctx.device, resID); } + + for (const auto& subpass : pass.subpassGraph.subpasses) { + mountResources(subpass); + } } void mountResources(const ComputePass& pass) const { @@ -1530,6 +1592,17 @@ struct RenderGraphVisitor : boost::dfs_visitor<> { } } + + void mountResources(const ComputeSubpass& pass) const { + auto& resg = ctx.resourceGraph; + PmrFlatSet mounted(ctx.scratch); + for (const auto& [name, views] : pass.computeViews) { + auto resID = findVertex(name, resg); + CC_EXPECTS(resID != ResourceGraph::null_vertex()); + resg.mount(ctx.device, resID); + } + } + void mountResources(const RaytracePass& pass) const { auto& resg = ctx.resourceGraph; PmrFlatSet mounted(ctx.scratch); @@ -1613,9 +1686,21 @@ struct RenderGraphVisitor : boost::dfs_visitor<> { begin(pass, vertID); }, [&](const RasterSubpass& subpass) { + // mountResources(subpass); + { + const auto& layoutName = get(RenderGraph::LayoutTag{}, ctx.g, vertID); + const auto& layoutID = locate(LayoutGraphData::null_vertex(), layoutName, ctx.lg); + ctx.currentPassLayoutID = layoutID; + } begin(subpass, vertID); }, [&](const ComputeSubpass& subpass) { + // mountResources(subpass); + { + const auto& layoutName = get(RenderGraph::LayoutTag{}, ctx.g, vertID); + const auto& layoutID = locate(LayoutGraphData::null_vertex(), layoutName, ctx.lg); + ctx.currentPassLayoutID = layoutID; + } begin(subpass, vertID); }, [&](const ComputePass& pass) { diff --git a/native/cocos/renderer/pipeline/custom/NativePipeline.cpp b/native/cocos/renderer/pipeline/custom/NativePipeline.cpp index 69ea585b1fb..2d87fdf161a 100644 --- a/native/cocos/renderer/pipeline/custom/NativePipeline.cpp +++ b/native/cocos/renderer/pipeline/custom/NativePipeline.cpp @@ -90,6 +90,10 @@ gfx::Device *NativePipeline::getDevice() const { return device; } +PipelineType NativePipeline::getPipelineType() const { + return PipelineType::STANDARD; +} + void NativePipeline::beginSetup() { renderGraph = RenderGraph(get_allocator()); } @@ -581,11 +585,6 @@ CopyPassBuilder *NativePipeline::addCopyPass() { return ccnew NativeCopyPassBuilder(this, &renderGraph, passID); } -// NOLINTNEXTLINE -SceneTransversal *NativePipeline::createSceneTransversal(const scene::Camera *camera, const scene::RenderScene *scene) { - return ccnew NativeSceneTransversal(camera, scene); -} - gfx::DescriptorSetLayout *NativePipeline::getDescriptorSetLayout(const ccstd::string &shaderName, UpdateFrequency freq) { const auto &lg = programLibrary->layoutGraph; auto iter = lg.shaderLayoutIndex.find(std::string_view{shaderName}); diff --git a/native/cocos/renderer/pipeline/custom/NativePipelineTypes.h b/native/cocos/renderer/pipeline/custom/NativePipelineTypes.h index 96e13d73944..383e8da4a01 100644 --- a/native/cocos/renderer/pipeline/custom/NativePipelineTypes.h +++ b/native/cocos/renderer/pipeline/custom/NativePipelineTypes.h @@ -85,6 +85,7 @@ class NativeSetter : public NativeRenderNode { void setReadWriteBuffer(const ccstd::string &name, gfx::Buffer *buffer) /*implements*/; void setReadWriteTexture(const ccstd::string &name, gfx::Texture *texture) /*implements*/; void setSampler(const ccstd::string &name, gfx::Sampler *sampler) /*implements*/; + void setCamera(const scene::Camera *camera) /*implements*/; void setVec4ArraySize(const ccstd::string& name, uint32_t sz); void setVec4ArrayElem(const ccstd::string& name, const cc::Vec4& vec, uint32_t id); @@ -147,9 +148,12 @@ class NativeRasterQueueBuilder final : public RasterQueueBuilder, public NativeS void setSampler(const ccstd::string &name, gfx::Sampler *sampler) override { NativeSetter::setSampler(name, sampler); } + void setCamera(const scene::Camera *camera) override { + NativeSetter::setCamera(camera); + } void addSceneOfCamera(scene::Camera *camera, LightInfo light, SceneFlags sceneFlags) override; - void addScene(const ccstd::string &name, SceneFlags sceneFlags) override; + void addScene(const scene::RenderScene *scene, SceneFlags sceneFlags) override; void addFullscreenQuad(Material *material, uint32_t passID, SceneFlags sceneFlags) override; void addCameraQuad(scene::Camera *camera, Material *material, uint32_t passID, SceneFlags sceneFlags) override; void clearRenderTarget(const ccstd::string &name, const gfx::Color &color) override; @@ -208,12 +212,15 @@ class NativeRasterSubpassBuilder final : public RasterSubpassBuilder, public Nat void setSampler(const ccstd::string &name, gfx::Sampler *sampler) override { NativeSetter::setSampler(name, sampler); } + void setCamera(const scene::Camera *camera) override { + NativeSetter::setCamera(camera); + } void addRenderTarget(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, gfx::LoadOp loadOp, gfx::StoreOp storeOp, const gfx::Color &color) override; void addDepthStencil(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, gfx::LoadOp loadOp, gfx::StoreOp storeOp, float depth, uint8_t stencil, gfx::ClearFlagBit clearFlags) override; void addTexture(const ccstd::string &name, const ccstd::string &slotName) override; - void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) override; - void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) override; + void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType, const ClearValue &clearValue) override; + void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType, const ClearValue &clearValue) override; void addComputeView(const ccstd::string &name, const ComputeView &view) override; void setViewport(const gfx::Viewport &viewport) override; RasterQueueBuilder *addQueue(QueueHint hint, const ccstd::string &layoutName) override; @@ -273,11 +280,14 @@ class NativeComputeSubpassBuilder final : public ComputeSubpassBuilder, public N void setSampler(const ccstd::string &name, gfx::Sampler *sampler) override { NativeSetter::setSampler(name, sampler); } + void setCamera(const scene::Camera *camera) override { + NativeSetter::setCamera(camera); + } void addRenderTarget(const ccstd::string &name, const ccstd::string &slotName) override; void addTexture(const ccstd::string &name, const ccstd::string &slotName) override; - void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) override; - void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) override; + void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType, const ClearValue &clearValue) override; + void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType, const ClearValue &clearValue) override; void addComputeView(const ccstd::string &name, const ComputeView &view) override; ComputeQueueBuilder *addQueue(const ccstd::string &layoutName) override; void setCustomShaderStages(const ccstd::string &name, gfx::ShaderStageFlagBit stageFlags) override; @@ -334,21 +344,25 @@ class NativeRasterPassBuilder final : public RasterPassBuilder, public NativeSet void setSampler(const ccstd::string &name, gfx::Sampler *sampler) override { NativeSetter::setSampler(name, sampler); } + void setCamera(const scene::Camera *camera) override { + NativeSetter::setCamera(camera); + } void addRenderTarget(const ccstd::string &name, const ccstd::string &slotName, gfx::LoadOp loadOp, gfx::StoreOp storeOp, const gfx::Color &color) override; void addDepthStencil(const ccstd::string &name, const ccstd::string &slotName, gfx::LoadOp loadOp, gfx::StoreOp storeOp, float depth, uint8_t stencil, gfx::ClearFlagBit clearFlags) override; void addTexture(const ccstd::string &name, const ccstd::string &slotName) override; - void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) override; - void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) override; void addRasterView(const ccstd::string &name, const RasterView &view) override; void addComputeView(const ccstd::string &name, const ComputeView &view) override; RasterQueueBuilder *addQueue(QueueHint hint, const ccstd::string &layoutName) override; - RasterSubpassBuilder *addRasterSubpass(const ccstd::string &layoutName) override; - ComputeSubpassBuilder *addComputeSubpass(const ccstd::string &layoutName) override; void setViewport(const gfx::Viewport &viewport) override; void setVersion(const ccstd::string &name, uint64_t version) override; bool getShowStatistics() const override; void setShowStatistics(bool enable) override; + + void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType, const ClearValue &clearValue) override; + void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType, const ClearValue &clearValue) override; + RasterSubpassBuilder *addRasterSubpass(const ccstd::string &layoutName) override; + ComputeSubpassBuilder *addComputeSubpass(const ccstd::string &layoutName) override; void setCustomShaderStages(const ccstd::string &name, gfx::ShaderStageFlagBit stageFlags) override; }; @@ -403,6 +417,9 @@ class NativeComputeQueueBuilder final : public ComputeQueueBuilder, public Nativ void setSampler(const ccstd::string &name, gfx::Sampler *sampler) override { NativeSetter::setSampler(name, sampler); } + void setCamera(const scene::Camera *camera) override { + NativeSetter::setCamera(camera); + } void addDispatch(uint32_t threadGroupCountX, uint32_t threadGroupCountY, uint32_t threadGroupCountZ, Material *material, uint32_t passID) override; }; @@ -458,10 +475,13 @@ class NativeComputePassBuilder final : public ComputePassBuilder, public NativeS void setSampler(const ccstd::string &name, gfx::Sampler *sampler) override { NativeSetter::setSampler(name, sampler); } + void setCamera(const scene::Camera *camera) override { + NativeSetter::setCamera(camera); + } void addTexture(const ccstd::string &name, const ccstd::string &slotName) override; - void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) override; - void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) override; + void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType, const ClearValue &clearValue) override; + void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType, const ClearValue &clearValue) override; void addComputeView(const ccstd::string &name, const ComputeView &view) override; ComputeQueueBuilder *addQueue(const ccstd::string &layoutName) override; void setCustomShaderStages(const ccstd::string &name, gfx::ShaderStageFlagBit stageFlags) override; @@ -903,33 +923,34 @@ class NativePipeline final : public Pipeline { void resetRenderQueue(bool reset) override; bool isRenderQueueReset() const override; + PipelineType getPipelineType() const override; void beginSetup() override; void endSetup() override; bool containsResource(const ccstd::string &name) const override; uint32_t addRenderTexture(const ccstd::string &name, gfx::Format format, uint32_t width, uint32_t height, scene::RenderWindow *renderWindow) override; uint32_t addRenderWindow(const ccstd::string &name, gfx::Format format, uint32_t width, uint32_t height, scene::RenderWindow *renderWindow) override; void updateRenderWindow(const ccstd::string &name, scene::RenderWindow *renderWindow) override; - uint32_t addStorageBuffer(const ccstd::string &name, gfx::Format format, uint32_t size, ResourceResidency residency) override; uint32_t addRenderTarget(const ccstd::string &name, gfx::Format format, uint32_t width, uint32_t height, ResourceResidency residency) override; uint32_t addDepthStencil(const ccstd::string &name, gfx::Format format, uint32_t width, uint32_t height, ResourceResidency residency) override; - uint32_t addStorageTexture(const ccstd::string &name, gfx::Format format, uint32_t width, uint32_t height, ResourceResidency residency) override; - uint32_t addShadingRateTexture(const ccstd::string &name, uint32_t width, uint32_t height, ResourceResidency residency) override; - uint32_t addCustomBuffer(const ccstd::string &name, const gfx::BufferInfo &info, const std::string &type) override; - uint32_t addCustomTexture(const ccstd::string &name, const gfx::TextureInfo &info, const std::string &type) override; - void updateStorageBuffer(const ccstd::string &name, uint32_t size, gfx::Format format) override; void updateRenderTarget(const ccstd::string &name, uint32_t width, uint32_t height, gfx::Format format) override; void updateDepthStencil(const ccstd::string &name, uint32_t width, uint32_t height, gfx::Format format) override; - void updateStorageTexture(const ccstd::string &name, uint32_t width, uint32_t height, gfx::Format format) override; - void updateShadingRateTexture(const ccstd::string &name, uint32_t width, uint32_t height) override; void beginFrame() override; void endFrame() override; - RasterPassBuilder *addRasterPass(uint32_t width, uint32_t height, const ccstd::string &layoutName) override; - ComputePassBuilder *addComputePass(const ccstd::string &layoutName) override; MovePassBuilder *addMovePass() override; CopyPassBuilder *addCopyPass() override; - SceneTransversal *createSceneTransversal(const scene::Camera *camera, const scene::RenderScene *scene) override; gfx::DescriptorSetLayout *getDescriptorSetLayout(const ccstd::string &shaderName, UpdateFrequency freq) override; + uint32_t addStorageBuffer(const ccstd::string &name, gfx::Format format, uint32_t size, ResourceResidency residency) override; + uint32_t addStorageTexture(const ccstd::string &name, gfx::Format format, uint32_t width, uint32_t height, ResourceResidency residency) override; + uint32_t addShadingRateTexture(const ccstd::string &name, uint32_t width, uint32_t height, ResourceResidency residency) override; + void updateStorageBuffer(const ccstd::string &name, uint32_t size, gfx::Format format) override; + void updateStorageTexture(const ccstd::string &name, uint32_t width, uint32_t height, gfx::Format format) override; + void updateShadingRateTexture(const ccstd::string &name, uint32_t width, uint32_t height) override; + RasterPassBuilder *addRasterPass(uint32_t width, uint32_t height, const ccstd::string &layoutName) override; + ComputePassBuilder *addComputePass(const ccstd::string &layoutName) override; + uint32_t addCustomBuffer(const ccstd::string &name, const gfx::BufferInfo &info, const std::string &type) override; + uint32_t addCustomTexture(const ccstd::string &name, const gfx::TextureInfo &info, const std::string &type) override; + void executeRenderGraph(const RenderGraph& rg); void addCustomContext(std::string_view name, std::shared_ptr ptr); diff --git a/native/cocos/renderer/pipeline/custom/NativeProgramLibrary.cpp b/native/cocos/renderer/pipeline/custom/NativeProgramLibrary.cpp index b0ff3ae6ea4..0cce9bb6ecd 100644 --- a/native/cocos/renderer/pipeline/custom/NativeProgramLibrary.cpp +++ b/native/cocos/renderer/pipeline/custom/NativeProgramLibrary.cpp @@ -201,7 +201,6 @@ ShaderProgramData &buildProgramData( auto shaderID = static_cast(phase.shaderPrograms.size()); phase.shaderIndex.emplace(programName, shaderID); auto &programData = phase.shaderPrograms.emplace_back(); - // build per-batch { auto res = programData.layout.descriptorSets.emplace( @@ -832,6 +831,11 @@ std::pair findBinding( return std::pair{v.set, v.binding}; } } + for (const auto &v : shaderInfo.subpassInputs) { + if (v.name == name) { + return std::pair{v.set, v.binding}; + } + } CC_EXPECTS(false); return {}; } @@ -911,6 +915,14 @@ void overwriteShaderSourceBinding( newLayout.append(std::to_string(set)); newLayout.append(", binding = "); newLayout.append(std::to_string(binding)); + + auto inputIndex = prevLayout.find("input_attachment_index"); + if (inputIndex != ccstd::string::npos) { + newLayout.append(", "); + auto endIndex = prevLayout.find_first_of(",)", inputIndex + 1); + newLayout.append(prevLayout.data(), inputIndex, endIndex - inputIndex); + } + newLayout.append(")"); // replace layout expression @@ -930,14 +942,6 @@ void overwriteShaderSourceBinding( end += offset; // find next uniform pos = source.find(" uniform ", end); - auto exceptionPos = source.find(" uniform subpassInput ", end); - if (exceptionPos != ccstd::string::npos) { - while (pos == exceptionPos) { - end += strlen(" uniform subpassInput "); - pos = source.find(" uniform ", end); - exceptionPos = source.find(" uniform subpassInput ", end); - } - } } } diff --git a/native/cocos/renderer/pipeline/custom/NativeRenderGraph.cpp b/native/cocos/renderer/pipeline/custom/NativeRenderGraph.cpp index 0ac34958c11..2da695a1d5e 100644 --- a/native/cocos/renderer/pipeline/custom/NativeRenderGraph.cpp +++ b/native/cocos/renderer/pipeline/custom/NativeRenderGraph.cpp @@ -146,6 +146,138 @@ void NativeSetter::setMat4ArrayElem(const ccstd::string &name, const cc::Mat4 &m namespace { +uint8_t getCombineSignY(gfx::Device *device) { + // 0: vk, 1: metal, 2: none, 3: gl-like + static int8_t combineSignY{-1}; + if (combineSignY < 0) { + const float screenSpaceSignY = device->getCapabilities().screenSpaceSignY * 0.5F + 0.5F; + const float clipSpaceSignY = device->getCapabilities().clipSpaceSignY * 0.5F + 0.5F; + combineSignY = static_cast(static_cast(screenSpaceSignY) << 1 | static_cast(clipSpaceSignY)); + } + return static_cast(combineSignY); +} + +void setCameraUBOValues( + const scene::Camera &camera, + const LayoutGraphData &layoutGraph, + const pipeline::PipelineSceneData &cfg, + const scene::DirectionalLight *mainLight, + RenderData &data) { + CC_EXPECTS(camera.getNode()); + CC_EXPECTS(cfg.getSkybox()); + const auto &skybox = *cfg.getSkybox(); + const auto &shadingScale = cfg.getShadingScale(); + // Camera + setMat4Impl(data, layoutGraph, "cc_matView", camera.getMatView()); + setMat4Impl(data, layoutGraph, "cc_matViewInv", camera.getNode()->getWorldMatrix()); + setMat4Impl(data, layoutGraph, "cc_matProj", camera.getMatProj()); + setMat4Impl(data, layoutGraph, "cc_matProjInv", camera.getMatProjInv()); + setMat4Impl(data, layoutGraph, "cc_matViewProj", camera.getMatViewProj()); + setMat4Impl(data, layoutGraph, "cc_matViewProjInv", camera.getMatViewProjInv()); + setVec4Impl(data, layoutGraph, "cc_cameraPos", + Vec4( + camera.getPosition().x, + camera.getPosition().y, + camera.getPosition().z, + getCombineSignY(cc::gfx::Device::getInstance()))); + setVec4Impl(data, layoutGraph, "cc_surfaceTransform", + Vec4( + static_cast(camera.getSurfaceTransform()), + 0.0F, + cosf(static_cast(mathutils::toRadian(skybox.getRotationAngle()))), + sinf(static_cast(mathutils::toRadian(skybox.getRotationAngle()))))); + setVec4Impl(data, layoutGraph, "cc_screenScale", + Vec4( + cfg.getShadingScale(), + cfg.getShadingScale(), + 1.0F / cfg.getShadingScale(), + 1.0F / cfg.getShadingScale())); + setVec4Impl(data, layoutGraph, "cc_exposure", + Vec4( + camera.getExposure(), + 1.0F / camera.getExposure(), + cfg.isHDR() ? 1.0F : 0.0F, + 1.0F / scene::Camera::getStandardExposureValue())); + + if (mainLight) { + const auto &shadowInfo = *cfg.getShadows(); + const bool shadowEnable = (mainLight->isShadowEnabled() && + shadowInfo.getType() == scene::ShadowType::SHADOW_MAP); + setVec4Impl(data, layoutGraph, "cc_mainLitDir", + Vec4( + mainLight->getDirection().x, + mainLight->getDirection().y, + mainLight->getDirection().z, + shadowEnable)); + auto r = mainLight->getColor().x; + auto g = mainLight->getColor().y; + auto b = mainLight->getColor().z; + if (mainLight->isUseColorTemperature()) { + r *= mainLight->getColorTemperatureRGB().x; + g *= mainLight->getColorTemperatureRGB().y; + b *= mainLight->getColorTemperatureRGB().z; + } + auto w = mainLight->getIlluminance(); + if (cfg.isHDR()) { + w *= camera.getExposure(); + } + setVec4Impl(data, layoutGraph, "cc_mainLitColor", Vec4(r, g, b, w)); + } else { + setVec4Impl(data, layoutGraph, "cc_mainLitDir", Vec4(0, 0, 1, 0)); + setVec4Impl(data, layoutGraph, "cc_mainLitColor", Vec4(0, 0, 0, 0)); + } + + CC_EXPECTS(cfg.getAmbient()); + auto &ambient = *cfg.getAmbient(); + auto &skyColor = ambient.getSkyColor(); + if (cfg.isHDR()) { + skyColor.w = ambient.getSkyIllum() * camera.getExposure(); + } else { + skyColor.w = ambient.getSkyIllum(); + } + setVec4Impl(data, layoutGraph, "cc_ambientSky", + Vec4(skyColor.x, skyColor.y, skyColor.z, skyColor.w)); + setVec4Impl(data, layoutGraph, "cc_ambientGround", + Vec4( + ambient.getGroundAlbedo().x, + ambient.getGroundAlbedo().y, + ambient.getGroundAlbedo().z, + skybox.getEnvmap() ? static_cast(skybox.getEnvmap()->mipmapLevel()) : 1.0F)); + + CC_EXPECTS(cfg.getFog()); + const auto &fog = *cfg.getFog(); + + const auto &colorTempRGB = fog.getColorArray(); + setVec4Impl(data, layoutGraph, "cc_fogColor", + Vec4(colorTempRGB.x, colorTempRGB.y, colorTempRGB.z, colorTempRGB.z)); + setVec4Impl(data, layoutGraph, "cc_fogBase", + Vec4(fog.getFogStart(), fog.getFogEnd(), fog.getFogDensity(), 0.0F)); + setVec4Impl(data, layoutGraph, "cc_fogAdd", + Vec4(fog.getFogTop(), fog.getFogRange(), fog.getFogAtten(), 0.0F)); + setVec4Impl(data, layoutGraph, "cc_nearFar", + Vec4(camera.getNearClip(), camera.getFarClip(), 0.0F, 0.0F)); + setVec4Impl(data, layoutGraph, "cc_viewPort", + Vec4( + camera.getViewport().x, + camera.getViewport().y, + shadingScale * static_cast(camera.getWindow()->getWidth()) * camera.getViewport().z, + shadingScale * static_cast(camera.getWindow()->getHeight()) * camera.getViewport().w)); +} + +} // namespace + +void NativeSetter::setCamera(const scene::Camera *camera) { + auto &data = get(RenderGraph::DataTag{}, *renderGraph, nodeID); + + setCameraUBOValues( + *camera, + *layoutGraph, + *pipelineRuntime->getPipelineSceneData(), + camera->getScene()->getMainLight(), data); +} + +namespace { + template void addRenderTargetImpl( RenderGraph &graph, @@ -262,34 +394,38 @@ void NativeRasterPassBuilder::addTexture(const ccstd::string &name, const ccstd: ccstd::pmr::string(slotName, renderGraph->get_allocator()), AccessType::READ, gfx::ClearFlagBit::NONE, - gfx::Color{}, - ClearValueType::FLOAT_TYPE, + ClearValueType::NONE, + ClearValue{}, gfx::ShaderStageFlagBit::NONE, renderGraph->get_allocator()}); } -void NativeRasterPassBuilder::addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) { +void NativeRasterPassBuilder::addStorageBuffer( + const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, + ClearValueType clearType, const ClearValue &clearValue) { addComputeView( name, ComputeView{ ccstd::pmr::string(slotName, renderGraph->get_allocator()), accessType, gfx::ClearFlagBit::NONE, - gfx::Color{}, - ClearValueType::FLOAT_TYPE, + clearType, + clearValue, gfx::ShaderStageFlagBit::NONE, renderGraph->get_allocator()}); } -void NativeRasterPassBuilder::addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) { +void NativeRasterPassBuilder::addStorageImage( + const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, + ClearValueType clearType, const ClearValue &clearValue) { addComputeView( name, ComputeView{ ccstd::pmr::string(slotName, renderGraph->get_allocator()), accessType, gfx::ClearFlagBit::NONE, - gfx::Color{}, - ClearValueType::FLOAT_TYPE, + clearType, + clearValue, gfx::ShaderStageFlagBit::NONE, renderGraph->get_allocator()}); } @@ -502,34 +638,38 @@ void NativeRasterSubpassBuilder::addTexture(const ccstd::string &name, const ccs ccstd::pmr::string(slotName, renderGraph->get_allocator()), AccessType::READ, gfx::ClearFlagBit::NONE, - gfx::Color{}, - ClearValueType::FLOAT_TYPE, + ClearValueType::NONE, + ClearValue{}, gfx::ShaderStageFlagBit::NONE, renderGraph->get_allocator()}); } -void NativeRasterSubpassBuilder::addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) { +void NativeRasterSubpassBuilder::addStorageBuffer( + const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, + ClearValueType clearType, const ClearValue &clearValue) { addComputeView( name, ComputeView{ ccstd::pmr::string(slotName, renderGraph->get_allocator()), accessType, gfx::ClearFlagBit::NONE, - gfx::Color{}, - ClearValueType::FLOAT_TYPE, + clearType, + clearValue, gfx::ShaderStageFlagBit::NONE, renderGraph->get_allocator()}); } -void NativeRasterSubpassBuilder::addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) { +void NativeRasterSubpassBuilder::addStorageImage( + const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, + ClearValueType clearType, const ClearValue &clearValue) { addComputeView( name, ComputeView{ ccstd::pmr::string(slotName, renderGraph->get_allocator()), accessType, gfx::ClearFlagBit::NONE, - gfx::Color{}, - ClearValueType::FLOAT_TYPE, + clearType, + clearValue, gfx::ShaderStageFlagBit::NONE, renderGraph->get_allocator()}); } @@ -652,34 +792,38 @@ void NativeComputeSubpassBuilder::addTexture(const ccstd::string &name, const cc ccstd::pmr::string(slotName, renderGraph->get_allocator()), AccessType::READ, gfx::ClearFlagBit::NONE, - gfx::Color{}, - ClearValueType::FLOAT_TYPE, + ClearValueType::NONE, + ClearValue{}, gfx::ShaderStageFlagBit::NONE, renderGraph->get_allocator()}); } -void NativeComputeSubpassBuilder::addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) { +void NativeComputeSubpassBuilder::addStorageBuffer( + const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, + ClearValueType clearType, const ClearValue &clearValue) { addComputeView( name, ComputeView{ ccstd::pmr::string(slotName, renderGraph->get_allocator()), accessType, gfx::ClearFlagBit::NONE, - gfx::Color{}, - ClearValueType::FLOAT_TYPE, + clearType, + clearValue, gfx::ShaderStageFlagBit::NONE, renderGraph->get_allocator()}); } -void NativeComputeSubpassBuilder::addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) { +void NativeComputeSubpassBuilder::addStorageImage( + const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, + ClearValueType clearType, const ClearValue &clearValue) { addComputeView( name, ComputeView{ ccstd::pmr::string(slotName, renderGraph->get_allocator()), accessType, gfx::ClearFlagBit::NONE, - gfx::Color{}, - ClearValueType::FLOAT_TYPE, + clearType, + clearValue, gfx::ShaderStageFlagBit::NONE, renderGraph->get_allocator()}); } @@ -717,124 +861,6 @@ ComputeQueueBuilder *NativeComputeSubpassBuilder::addQueue(const ccstd::string & namespace { -uint8_t getCombineSignY(gfx::Device *device) { - // 0: vk, 1: metal, 2: none, 3: gl-like - static int8_t combineSignY{-1}; - if (combineSignY < 0) { - const float screenSpaceSignY = device->getCapabilities().screenSpaceSignY * 0.5F + 0.5F; - const float clipSpaceSignY = device->getCapabilities().clipSpaceSignY * 0.5F + 0.5F; - combineSignY = static_cast(static_cast(screenSpaceSignY) << 1 | static_cast(clipSpaceSignY)); - } - return static_cast(combineSignY); -} - -void setCameraUBOValues( - const scene::Camera &camera, - const LayoutGraphData &layoutGraph, - const pipeline::PipelineSceneData &cfg, - const scene::DirectionalLight *mainLight, - RenderData &data) { - CC_EXPECTS(camera.getNode()); - CC_EXPECTS(cfg.getSkybox()); - const auto &skybox = *cfg.getSkybox(); - const auto &shadingScale = cfg.getShadingScale(); - // Camera - setMat4Impl(data, layoutGraph, "cc_matView", camera.getMatView()); - setMat4Impl(data, layoutGraph, "cc_matViewInv", camera.getNode()->getWorldMatrix()); - setMat4Impl(data, layoutGraph, "cc_matProj", camera.getMatProj()); - setMat4Impl(data, layoutGraph, "cc_matProjInv", camera.getMatProjInv()); - setMat4Impl(data, layoutGraph, "cc_matViewProj", camera.getMatViewProj()); - setMat4Impl(data, layoutGraph, "cc_matViewProjInv", camera.getMatViewProjInv()); - setVec4Impl(data, layoutGraph, "cc_cameraPos", - Vec4( - camera.getPosition().x, - camera.getPosition().y, - camera.getPosition().z, - getCombineSignY(cc::gfx::Device::getInstance()))); - setVec4Impl(data, layoutGraph, "cc_surfaceTransform", - Vec4( - static_cast(camera.getSurfaceTransform()), - 0.0F, - cosf(static_cast(mathutils::toRadian(skybox.getRotationAngle()))), - sinf(static_cast(mathutils::toRadian(skybox.getRotationAngle()))))); - setVec4Impl(data, layoutGraph, "cc_screenScale", - Vec4( - cfg.getShadingScale(), - cfg.getShadingScale(), - 1.0F / cfg.getShadingScale(), - 1.0F / cfg.getShadingScale())); - setVec4Impl(data, layoutGraph, "cc_exposure", - Vec4( - camera.getExposure(), - 1.0F / camera.getExposure(), - cfg.isHDR() ? 1.0F : 0.0F, - 1.0F / scene::Camera::getStandardExposureValue())); - - if (mainLight) { - const auto &shadowInfo = *cfg.getShadows(); - const bool shadowEnable = (mainLight->isShadowEnabled() && - shadowInfo.getType() == scene::ShadowType::SHADOW_MAP); - setVec4Impl(data, layoutGraph, "cc_mainLitDir", - Vec4( - mainLight->getDirection().x, - mainLight->getDirection().y, - mainLight->getDirection().z, - shadowEnable)); - auto r = mainLight->getColor().x; - auto g = mainLight->getColor().y; - auto b = mainLight->getColor().z; - if (mainLight->isUseColorTemperature()) { - r *= mainLight->getColorTemperatureRGB().x; - g *= mainLight->getColorTemperatureRGB().y; - b *= mainLight->getColorTemperatureRGB().z; - } - auto w = mainLight->getIlluminance(); - if (cfg.isHDR()) { - w *= camera.getExposure(); - } - setVec4Impl(data, layoutGraph, "cc_mainLitColor", Vec4(r, g, b, w)); - } else { - setVec4Impl(data, layoutGraph, "cc_mainLitDir", Vec4(0, 0, 1, 0)); - setVec4Impl(data, layoutGraph, "cc_mainLitColor", Vec4(0, 0, 0, 0)); - } - - CC_EXPECTS(cfg.getAmbient()); - auto &ambient = *cfg.getAmbient(); - auto &skyColor = ambient.getSkyColor(); - if (cfg.isHDR()) { - skyColor.w = ambient.getSkyIllum() * camera.getExposure(); - } else { - skyColor.w = ambient.getSkyIllum(); - } - setVec4Impl(data, layoutGraph, "cc_ambientSky", - Vec4(skyColor.x, skyColor.y, skyColor.z, skyColor.w)); - setVec4Impl(data, layoutGraph, "cc_ambientGround", - Vec4( - ambient.getGroundAlbedo().x, - ambient.getGroundAlbedo().y, - ambient.getGroundAlbedo().z, - skybox.getEnvmap() ? static_cast(skybox.getEnvmap()->mipmapLevel()) : 1.0F)); - - CC_EXPECTS(cfg.getFog()); - const auto &fog = *cfg.getFog(); - - const auto &colorTempRGB = fog.getColorArray(); - setVec4Impl(data, layoutGraph, "cc_fogColor", - Vec4(colorTempRGB.x, colorTempRGB.y, colorTempRGB.z, colorTempRGB.z)); - setVec4Impl(data, layoutGraph, "cc_fogBase", - Vec4(fog.getFogStart(), fog.getFogEnd(), fog.getFogDensity(), 0.0F)); - setVec4Impl(data, layoutGraph, "cc_fogAdd", - Vec4(fog.getFogTop(), fog.getFogRange(), fog.getFogAtten(), 0.0F)); - setVec4Impl(data, layoutGraph, "cc_nearFar", - Vec4(camera.getNearClip(), camera.getFarClip(), 0.0F, 0.0F)); - setVec4Impl(data, layoutGraph, "cc_viewPort", - Vec4( - camera.getViewport().x, - camera.getViewport().y, - shadingScale * static_cast(camera.getWindow()->getWidth()) * camera.getViewport().z, - shadingScale * static_cast(camera.getWindow()->getHeight()) * camera.getViewport().w)); -} - void setShadowUBOLightView( gfx::Device *device, const LayoutGraphData &layoutGraph, @@ -1187,18 +1213,18 @@ void NativeRasterQueueBuilder::addSceneOfCamera( data); } -void NativeRasterQueueBuilder::addScene(const ccstd::string &name, SceneFlags sceneFlags) { - SceneData scene(renderGraph->get_allocator()); - scene.name = name; - scene.flags = sceneFlags; +void NativeRasterQueueBuilder::addScene(const scene::RenderScene *scene, SceneFlags sceneFlags) { + SceneData data(renderGraph->get_allocator()); + data.scenes.emplace_back(scene); + data.flags = sceneFlags; auto sceneID = addVertex( SceneTag{}, - std::forward_as_tuple(name.c_str()), + std::forward_as_tuple("Scene"), std::forward_as_tuple(), std::forward_as_tuple(), std::forward_as_tuple(), - std::forward_as_tuple(std::move(scene)), + std::forward_as_tuple(std::move(data)), *renderGraph, nodeID); CC_ENSURES(sceneID != RenderGraph::null_vertex()); } @@ -1434,34 +1460,38 @@ void NativeComputePassBuilder::addTexture(const ccstd::string &name, const ccstd ccstd::pmr::string(slotName, renderGraph->get_allocator()), AccessType::READ, gfx::ClearFlagBit::NONE, - gfx::Color{}, - ClearValueType::FLOAT_TYPE, + ClearValueType::NONE, + ClearValue{}, gfx::ShaderStageFlagBit::NONE, renderGraph->get_allocator()}); } -void NativeComputePassBuilder::addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) { +void NativeComputePassBuilder::addStorageBuffer( + const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, + ClearValueType clearType, const ClearValue &clearValue) { addComputeView( name, ComputeView{ ccstd::pmr::string(slotName, renderGraph->get_allocator()), accessType, gfx::ClearFlagBit::NONE, - gfx::Color{}, - ClearValueType::FLOAT_TYPE, + clearType, + clearValue, gfx::ShaderStageFlagBit::NONE, renderGraph->get_allocator()}); } -void NativeComputePassBuilder::addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) { +void NativeComputePassBuilder::addStorageImage( + const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, + ClearValueType clearType, const ClearValue &clearValue) { addComputeView( name, ComputeView{ ccstd::pmr::string(slotName, renderGraph->get_allocator()), accessType, gfx::ClearFlagBit::NONE, - gfx::Color{}, - ClearValueType::FLOAT_TYPE, + clearType, + clearValue, gfx::ShaderStageFlagBit::NONE, renderGraph->get_allocator()}); } @@ -1622,7 +1652,7 @@ struct RenderGraphPrintVisitor : boost::dfs_visitor<> { INDENT(); OSS << "accessType: " << getName(computeView.accessType) << ";\n"; OSS << "clearFlags: " << getName(computeView.clearFlags) << ";\n"; - const auto &c = computeView.clearColor; + const auto &c = computeView.clearValue; if (hasAnyFlags(computeView.clearFlags, gfx::ClearFlagBit::COLOR)) { OSS << "clearColor: [" << c.x << ", " << c.y << ", " << c.z << ", " << c.z << "];\n"; } else if (hasAnyFlags(computeView.clearFlags, gfx::ClearFlagBit::DEPTH_STENCIL)) { @@ -1654,7 +1684,7 @@ struct RenderGraphPrintVisitor : boost::dfs_visitor<> { INDENT(); OSS << "accessType: " << getName(computeView.accessType) << ";\n"; OSS << "clearFlags: " << getName(computeView.clearFlags) << ";\n"; - const auto &c = computeView.clearColor; + const auto &c = computeView.clearValue; if (hasAnyFlags(computeView.clearFlags, gfx::ClearFlagBit::COLOR)) { OSS << "clearColor: [" << c.x << ", " << c.y << ", " << c.z << ", " << c.z << "];\n"; } else if (hasAnyFlags(computeView.clearFlags, gfx::ClearFlagBit::DEPTH_STENCIL)) { diff --git a/native/cocos/renderer/pipeline/custom/RenderCommonFwd.h b/native/cocos/renderer/pipeline/custom/RenderCommonFwd.h index d18233535ff..693d4d97ae6 100644 --- a/native/cocos/renderer/pipeline/custom/RenderCommonFwd.h +++ b/native/cocos/renderer/pipeline/custom/RenderCommonFwd.h @@ -66,6 +66,7 @@ struct RasterView; enum class ClearValueType; +struct ClearValue; struct ComputeView; struct LightInfo; @@ -90,6 +91,11 @@ struct hash { hash_t operator()(const cc::render::RasterView& val) const noexcept; }; +template <> +struct hash { + hash_t operator()(const cc::render::ClearValue& val) const noexcept; +}; + template <> struct hash { hash_t operator()(const cc::render::ComputeView& val) const noexcept; diff --git a/native/cocos/renderer/pipeline/custom/RenderCommonJsb.cpp b/native/cocos/renderer/pipeline/custom/RenderCommonJsb.cpp index 3264de55181..c5c032142a2 100644 --- a/native/cocos/renderer/pipeline/custom/RenderCommonJsb.cpp +++ b/native/cocos/renderer/pipeline/custom/RenderCommonJsb.cpp @@ -69,6 +69,26 @@ bool nativevalue_to_se(const cc::render::RasterView &from, se::Value &to, se::Ob return true; } +bool nativevalue_to_se(const cc::render::ClearValue &from, se::Value &to, se::Object *ctx) { // NOLINT + se::HandleObject obj(se::Object::createPlainObject()); + se::Value tmp; + + nativevalue_to_se(from.x, tmp, ctx); + obj->setProperty("x", tmp); + + nativevalue_to_se(from.y, tmp, ctx); + obj->setProperty("y", tmp); + + nativevalue_to_se(from.z, tmp, ctx); + obj->setProperty("z", tmp); + + nativevalue_to_se(from.w, tmp, ctx); + obj->setProperty("w", tmp); + + to.setObject(obj); + return true; +} + bool nativevalue_to_se(const cc::render::ComputeView &from, se::Value &to, se::Object *ctx) { // NOLINT se::HandleObject obj(se::Object::createPlainObject()); se::Value tmp; @@ -82,12 +102,12 @@ bool nativevalue_to_se(const cc::render::ComputeView &from, se::Value &to, se::O nativevalue_to_se(from.clearFlags, tmp, ctx); obj->setProperty("clearFlags", tmp); - nativevalue_to_se(from.clearColor, tmp, ctx); - obj->setProperty("clearColor", tmp); - nativevalue_to_se(from.clearValueType, tmp, ctx); obj->setProperty("clearValueType", tmp); + nativevalue_to_se(from.clearValue, tmp, ctx); + obj->setProperty("clearValue", tmp); + nativevalue_to_se(from.shaderStageFlags, tmp, ctx); obj->setProperty("shaderStageFlags", tmp); @@ -282,6 +302,32 @@ bool sevalue_to_native(const se::Value &from, cc::render return ok; } +template <> +bool sevalue_to_native(const se::Value &from, cc::render::ClearValue *to, se::Object *ctx) { // NOLINT + SE_PRECONDITION2(from.isObject(), false, " Convert parameter to ClearValue failed !"); + + auto *obj = const_cast(from.toObject()); + bool ok = true; + se::Value field; + obj->getProperty("x", &field, true); + if(!field.isNullOrUndefined()) { + ok &= sevalue_to_native(field, &(to->x), ctx); + } + obj->getProperty("y", &field, true); + if(!field.isNullOrUndefined()) { + ok &= sevalue_to_native(field, &(to->y), ctx); + } + obj->getProperty("z", &field, true); + if(!field.isNullOrUndefined()) { + ok &= sevalue_to_native(field, &(to->z), ctx); + } + obj->getProperty("w", &field, true); + if(!field.isNullOrUndefined()) { + ok &= sevalue_to_native(field, &(to->w), ctx); + } + return ok; +} + template <> bool sevalue_to_native(const se::Value &from, cc::render::ComputeView *to, se::Object *ctx) { // NOLINT SE_PRECONDITION2(from.isObject(), false, " Convert parameter to ComputeView failed !"); @@ -301,14 +347,14 @@ bool sevalue_to_native(const se::Value &from, cc::rende if(!field.isNullOrUndefined()) { ok &= sevalue_to_native(field, &(to->clearFlags), ctx); } - obj->getProperty("clearColor", &field, true); - if(!field.isNullOrUndefined()) { - ok &= sevalue_to_native(field, &(to->clearColor), ctx); - } obj->getProperty("clearValueType", &field, true); if(!field.isNullOrUndefined()) { ok &= sevalue_to_native(field, &(to->clearValueType), ctx); } + obj->getProperty("clearValue", &field, true); + if(!field.isNullOrUndefined()) { + ok &= sevalue_to_native(field, &(to->clearValue), ctx); + } obj->getProperty("shaderStageFlags", &field, true); if(!field.isNullOrUndefined()) { ok &= sevalue_to_native(field, &(to->shaderStageFlags), ctx); diff --git a/native/cocos/renderer/pipeline/custom/RenderCommonJsb.h b/native/cocos/renderer/pipeline/custom/RenderCommonJsb.h index a79618024ed..73940974764 100644 --- a/native/cocos/renderer/pipeline/custom/RenderCommonJsb.h +++ b/native/cocos/renderer/pipeline/custom/RenderCommonJsb.h @@ -34,6 +34,8 @@ bool nativevalue_to_se(const cc::render::RasterView &from, se::Value &to, se::Object *ctx); // NOLINT +bool nativevalue_to_se(const cc::render::ClearValue &from, se::Value &to, se::Object *ctx); // NOLINT + bool nativevalue_to_se(const cc::render::ComputeView &from, se::Value &to, se::Object *ctx); // NOLINT bool nativevalue_to_se(const cc::render::LightInfo &from, se::Value &to, se::Object *ctx); // NOLINT @@ -52,6 +54,9 @@ bool nativevalue_to_se(const cc::render::MovePair &from, se::Value &to, se::Obje template <> bool sevalue_to_native(const se::Value &from, cc::render::RasterView *to, se::Object *ctx); // NOLINT +template <> +bool sevalue_to_native(const se::Value &from, cc::render::ClearValue *to, se::Object *ctx); // NOLINT + template <> bool sevalue_to_native(const se::Value &from, cc::render::ComputeView *to, se::Object *ctx); // NOLINT diff --git a/native/cocos/renderer/pipeline/custom/RenderCommonNames.h b/native/cocos/renderer/pipeline/custom/RenderCommonNames.h index b1a3af0ecbc..25e4d9e4d2a 100644 --- a/native/cocos/renderer/pipeline/custom/RenderCommonNames.h +++ b/native/cocos/renderer/pipeline/custom/RenderCommonNames.h @@ -127,11 +127,13 @@ inline const char* getName(AccessType e) noexcept { inline const char* getName(const RasterView& /*v*/) noexcept { return "RasterView"; } inline const char* getName(ClearValueType e) noexcept { switch (e) { + case ClearValueType::NONE: return "NONE"; case ClearValueType::FLOAT_TYPE: return "FLOAT_TYPE"; case ClearValueType::INT_TYPE: return "INT_TYPE"; } return ""; } +inline const char* getName(const ClearValue& /*v*/) noexcept { return "ClearValue"; } inline const char* getName(const ComputeView& /*v*/) noexcept { return "ComputeView"; } inline const char* getName(const LightInfo& /*v*/) noexcept { return "LightInfo"; } inline const char* getName(DescriptorTypeOrder e) noexcept { diff --git a/native/cocos/renderer/pipeline/custom/RenderCommonSerialization.h b/native/cocos/renderer/pipeline/custom/RenderCommonSerialization.h index 8679088980b..2f0b3af3b60 100644 --- a/native/cocos/renderer/pipeline/custom/RenderCommonSerialization.h +++ b/native/cocos/renderer/pipeline/custom/RenderCommonSerialization.h @@ -61,12 +61,26 @@ inline void load(InputArchive& ar, RasterView& v) { load(ar, v.shaderStageFlags); } +inline void save(OutputArchive& ar, const ClearValue& v) { + save(ar, v.x); + save(ar, v.y); + save(ar, v.z); + save(ar, v.w); +} + +inline void load(InputArchive& ar, ClearValue& v) { + load(ar, v.x); + load(ar, v.y); + load(ar, v.z); + load(ar, v.w); +} + inline void save(OutputArchive& ar, const ComputeView& v) { save(ar, v.name); save(ar, v.accessType); save(ar, v.clearFlags); - save(ar, v.clearColor); save(ar, v.clearValueType); + save(ar, v.clearValue); save(ar, v.shaderStageFlags); } @@ -74,8 +88,8 @@ inline void load(InputArchive& ar, ComputeView& v) { load(ar, v.name); load(ar, v.accessType); load(ar, v.clearFlags); - load(ar, v.clearColor); load(ar, v.clearValueType); + load(ar, v.clearValue); load(ar, v.shaderStageFlags); } diff --git a/native/cocos/renderer/pipeline/custom/RenderCommonTypes.cpp b/native/cocos/renderer/pipeline/custom/RenderCommonTypes.cpp index cf3ab922328..eef8aebe038 100644 --- a/native/cocos/renderer/pipeline/custom/RenderCommonTypes.cpp +++ b/native/cocos/renderer/pipeline/custom/RenderCommonTypes.cpp @@ -72,28 +72,28 @@ RasterView::RasterView(RasterView const& rhs, const allocator_type& alloc) ComputeView::ComputeView(const allocator_type& alloc) noexcept : name(alloc) {} -ComputeView::ComputeView(ccstd::pmr::string nameIn, AccessType accessTypeIn, gfx::ClearFlagBit clearFlagsIn, gfx::Color clearColorIn, ClearValueType clearValueTypeIn, gfx::ShaderStageFlagBit shaderStageFlagsIn, const allocator_type& alloc) noexcept +ComputeView::ComputeView(ccstd::pmr::string nameIn, AccessType accessTypeIn, gfx::ClearFlagBit clearFlagsIn, ClearValueType clearValueTypeIn, ClearValue clearValueIn, gfx::ShaderStageFlagBit shaderStageFlagsIn, const allocator_type& alloc) noexcept : name(std::move(nameIn), alloc), accessType(accessTypeIn), clearFlags(clearFlagsIn), - clearColor(clearColorIn), clearValueType(clearValueTypeIn), + clearValue(clearValueIn), shaderStageFlags(shaderStageFlagsIn) {} ComputeView::ComputeView(ComputeView&& rhs, const allocator_type& alloc) : name(std::move(rhs.name), alloc), accessType(rhs.accessType), clearFlags(rhs.clearFlags), - clearColor(rhs.clearColor), clearValueType(rhs.clearValueType), + clearValue(rhs.clearValue), shaderStageFlags(rhs.shaderStageFlags) {} ComputeView::ComputeView(ComputeView const& rhs, const allocator_type& alloc) : name(rhs.name, alloc), accessType(rhs.accessType), clearFlags(rhs.clearFlags), - clearColor(rhs.clearColor), clearValueType(rhs.clearValueType), + clearValue(rhs.clearValue), shaderStageFlags(rhs.shaderStageFlags) {} CopyPair::CopyPair(const allocator_type& alloc) noexcept diff --git a/native/cocos/renderer/pipeline/custom/RenderCommonTypes.h b/native/cocos/renderer/pipeline/custom/RenderCommonTypes.h index 3bf1aaeffc2..d880cf8eb36 100644 --- a/native/cocos/renderer/pipeline/custom/RenderCommonTypes.h +++ b/native/cocos/renderer/pipeline/custom/RenderCommonTypes.h @@ -230,10 +230,34 @@ inline bool operator!=(const RasterView& lhs, const RasterView& rhs) noexcept { } enum class ClearValueType { + NONE, FLOAT_TYPE, INT_TYPE, }; +struct ClearValue { + ClearValue() = default; + ClearValue(double xIn, double yIn, double zIn, double wIn) noexcept // NOLINT + : x(xIn), + y(yIn), + z(zIn), + w(wIn) {} + + double x{0}; + double y{0}; + double z{0}; + double w{0}; +}; + +inline bool operator==(const ClearValue& lhs, const ClearValue& rhs) noexcept { + return std::forward_as_tuple(lhs.x, lhs.y, lhs.z, lhs.w) == + std::forward_as_tuple(rhs.x, rhs.y, rhs.z, rhs.w); +} + +inline bool operator!=(const ClearValue& lhs, const ClearValue& rhs) noexcept { + return !(lhs == rhs); +} + struct ComputeView { using allocator_type = boost::container::pmr::polymorphic_allocator; allocator_type get_allocator() const noexcept { // NOLINT @@ -241,7 +265,7 @@ struct ComputeView { } ComputeView(const allocator_type& alloc = boost::container::pmr::get_default_resource()) noexcept; // NOLINT - ComputeView(ccstd::pmr::string nameIn, AccessType accessTypeIn, gfx::ClearFlagBit clearFlagsIn, gfx::Color clearColorIn, ClearValueType clearValueTypeIn, gfx::ShaderStageFlagBit shaderStageFlagsIn, const allocator_type& alloc = boost::container::pmr::get_default_resource()) noexcept; + ComputeView(ccstd::pmr::string nameIn, AccessType accessTypeIn, gfx::ClearFlagBit clearFlagsIn, ClearValueType clearValueTypeIn, ClearValue clearValueIn, gfx::ShaderStageFlagBit shaderStageFlagsIn, const allocator_type& alloc = boost::container::pmr::get_default_resource()) noexcept; ComputeView(ComputeView&& rhs, const allocator_type& alloc); ComputeView(ComputeView const& rhs, const allocator_type& alloc); @@ -260,8 +284,8 @@ struct ComputeView { ccstd::pmr::string name; AccessType accessType{AccessType::READ}; gfx::ClearFlagBit clearFlags{gfx::ClearFlagBit::NONE}; - gfx::Color clearColor; - ClearValueType clearValueType{ClearValueType::FLOAT_TYPE}; + ClearValueType clearValueType{ClearValueType::NONE}; + ClearValue clearValue; gfx::ShaderStageFlagBit shaderStageFlags{gfx::ShaderStageFlagBit::NONE}; }; @@ -425,6 +449,15 @@ inline hash_t hash::operator()(const cc::render::RasterV return seed; } +inline hash_t hash::operator()(const cc::render::ClearValue& val) const noexcept { + hash_t seed = 0; + hash_combine(seed, val.x); + hash_combine(seed, val.y); + hash_combine(seed, val.z); + hash_combine(seed, val.w); + return seed; +} + inline hash_t hash::operator()(const cc::render::ComputeView& val) const noexcept { hash_t seed = 0; hash_combine(seed, val.name); diff --git a/native/cocos/renderer/pipeline/custom/RenderGraphTypes.h b/native/cocos/renderer/pipeline/custom/RenderGraphTypes.h index a41c7f679c8..1607cb0f7fe 100644 --- a/native/cocos/renderer/pipeline/custom/RenderGraphTypes.h +++ b/native/cocos/renderer/pipeline/custom/RenderGraphTypes.h @@ -678,7 +678,7 @@ struct SceneData { scene::Camera* camera{nullptr}; LightInfo light; SceneFlags flags{SceneFlags::NONE}; - ccstd::pmr::vector scenes; + ccstd::pmr::vector scenes; }; struct Dispatch { diff --git a/native/cocos/renderer/pipeline/custom/RenderInterfaceFwd.h b/native/cocos/renderer/pipeline/custom/RenderInterfaceFwd.h index 8bd1f419e23..045b3a07e8c 100644 --- a/native/cocos/renderer/pipeline/custom/RenderInterfaceFwd.h +++ b/native/cocos/renderer/pipeline/custom/RenderInterfaceFwd.h @@ -46,6 +46,7 @@ class RasterQueueBuilder; class RasterSubpassBuilder; class ComputeQueueBuilder; class ComputeSubpassBuilder; +class BasicRenderPassBuilder; class RasterPassBuilder; class ComputePassBuilder; class MovePassBuilder; @@ -53,6 +54,10 @@ class CopyPassBuilder; class SceneVisitor; class SceneTask; class SceneTransversal; + +enum class PipelineType; + +class BasicPipeline; class Pipeline; class PipelineBuilder; class RenderingModule; diff --git a/native/cocos/renderer/pipeline/custom/RenderInterfaceTypes.h b/native/cocos/renderer/pipeline/custom/RenderInterfaceTypes.h index bbd01a52787..c7449e23e70 100644 --- a/native/cocos/renderer/pipeline/custom/RenderInterfaceTypes.h +++ b/native/cocos/renderer/pipeline/custom/RenderInterfaceTypes.h @@ -119,7 +119,7 @@ class RenderNode { virtual ccstd::string getName() const = 0; virtual void setName(const ccstd::string &name) = 0; /** - * @beta method's name might change + * @beta function signature might change */ virtual void setCustomBehavior(const ccstd::string &name) = 0; }; @@ -140,27 +140,31 @@ class Setter : public RenderNode { virtual void setReadWriteBuffer(const ccstd::string &name, gfx::Buffer *buffer) = 0; virtual void setReadWriteTexture(const ccstd::string &name, gfx::Texture *texture) = 0; virtual void setSampler(const ccstd::string &name, gfx::Sampler *sampler) = 0; + virtual void setCamera(const scene::Camera *camera) = 0; }; class RasterQueueBuilder : public Setter { public: RasterQueueBuilder() noexcept = default; + /** + * @deprecated method will be removed in 3.8.0 + */ virtual void addSceneOfCamera(scene::Camera *camera, LightInfo light, SceneFlags sceneFlags) = 0; - virtual void addScene(const ccstd::string &name, SceneFlags sceneFlags) = 0; + virtual void addScene(const scene::RenderScene *scene, SceneFlags sceneFlags) = 0; virtual void addFullscreenQuad(Material *material, uint32_t passID, SceneFlags sceneFlags) = 0; virtual void addCameraQuad(scene::Camera *camera, Material *material, uint32_t passID, SceneFlags sceneFlags) = 0; virtual void clearRenderTarget(const ccstd::string &name, const gfx::Color &color) = 0; virtual void setViewport(const gfx::Viewport &viewport) = 0; /** - * @beta method's name might change + * @beta function signature might change */ virtual void addCustomCommand(std::string_view customBehavior) = 0; void addSceneOfCamera(scene::Camera *camera, LightInfo light) { addSceneOfCamera(camera, std::move(light), SceneFlags::NONE); } - void addScene(const ccstd::string &name) { - addScene(name, SceneFlags::NONE); + void addScene(const scene::RenderScene *scene) { + addScene(scene, SceneFlags::NONE); } void addFullscreenQuad(Material *material, uint32_t passID) { addFullscreenQuad(material, passID, SceneFlags::NONE); @@ -177,26 +181,11 @@ class RasterSubpassBuilder : public Setter { public: RasterSubpassBuilder() noexcept = default; - /** - * @beta method's name might change - */ virtual void addRenderTarget(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, gfx::LoadOp loadOp, gfx::StoreOp storeOp, const gfx::Color &color) = 0; - /** - * @beta method's name might change - */ virtual void addDepthStencil(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, gfx::LoadOp loadOp, gfx::StoreOp storeOp, float depth, uint8_t stencil, gfx::ClearFlagBit clearFlags) = 0; - /** - * @beta method's name might change - */ virtual void addTexture(const ccstd::string &name, const ccstd::string &slotName) = 0; - /** - * @beta method's name might change - */ - virtual void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) = 0; - /** - * @beta method's name might change - */ - virtual void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) = 0; + virtual void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType, const ClearValue &clearValue) = 0; + virtual void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType, const ClearValue &clearValue) = 0; /** * @deprecated method will be removed in 3.8.0 */ @@ -206,7 +195,7 @@ class RasterSubpassBuilder : public Setter { virtual bool getShowStatistics() const = 0; virtual void setShowStatistics(bool enable) = 0; /** - * @beta method's name might change + * @beta function signature might change */ virtual void setCustomShaderStages(const ccstd::string &name, gfx::ShaderStageFlagBit stageFlags) = 0; void addRenderTarget(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) { @@ -233,6 +222,18 @@ class RasterSubpassBuilder : public Setter { void addDepthStencil(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, gfx::LoadOp loadOp, gfx::StoreOp storeOp, float depth, uint8_t stencil) { addDepthStencil(name, accessType, slotName, loadOp, storeOp, depth, stencil, gfx::ClearFlagBit::DEPTH_STENCIL); } + void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) { + addStorageBuffer(name, accessType, slotName, ClearValueType::NONE, {}); + } + void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType) { + addStorageBuffer(name, accessType, slotName, clearType, {}); + } + void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) { + addStorageImage(name, accessType, slotName, ClearValueType::NONE, {}); + } + void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType) { + addStorageImage(name, accessType, slotName, clearType, {}); + } RasterQueueBuilder *addQueue() { return addQueue(QueueHint::NONE, ""); } @@ -258,60 +259,43 @@ class ComputeSubpassBuilder : public Setter { public: ComputeSubpassBuilder() noexcept = default; - /** - * @beta method's name might change - */ virtual void addRenderTarget(const ccstd::string &name, const ccstd::string &slotName) = 0; - /** - * @beta method's name might change - */ virtual void addTexture(const ccstd::string &name, const ccstd::string &slotName) = 0; - /** - * @beta method's name might change - */ - virtual void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) = 0; - /** - * @beta method's name might change - */ - virtual void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) = 0; + virtual void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType, const ClearValue &clearValue) = 0; + virtual void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType, const ClearValue &clearValue) = 0; /** * @deprecated method will be removed in 3.8.0 */ virtual void addComputeView(const ccstd::string &name, const ComputeView &view) = 0; virtual ComputeQueueBuilder *addQueue(const ccstd::string &layoutName) = 0; /** - * @beta method's name might change + * @beta function signature might change */ virtual void setCustomShaderStages(const ccstd::string &name, gfx::ShaderStageFlagBit stageFlags) = 0; + void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) { + addStorageBuffer(name, accessType, slotName, ClearValueType::NONE, {}); + } + void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType) { + addStorageBuffer(name, accessType, slotName, clearType, {}); + } + void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) { + addStorageImage(name, accessType, slotName, ClearValueType::NONE, {}); + } + void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType) { + addStorageImage(name, accessType, slotName, clearType, {}); + } ComputeQueueBuilder *addQueue() { return addQueue(""); } }; -class RasterPassBuilder : public Setter { +class BasicRenderPassBuilder : public Setter { public: - RasterPassBuilder() noexcept = default; + BasicRenderPassBuilder() noexcept = default; - /** - * @beta method's name might change - */ virtual void addRenderTarget(const ccstd::string &name, const ccstd::string &slotName, gfx::LoadOp loadOp, gfx::StoreOp storeOp, const gfx::Color &color) = 0; - /** - * @beta method's name might change - */ virtual void addDepthStencil(const ccstd::string &name, const ccstd::string &slotName, gfx::LoadOp loadOp, gfx::StoreOp storeOp, float depth, uint8_t stencil, gfx::ClearFlagBit clearFlags) = 0; - /** - * @beta method's name might change - */ virtual void addTexture(const ccstd::string &name, const ccstd::string &slotName) = 0; - /** - * @beta method's name might change - */ - virtual void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) = 0; - /** - * @beta method's name might change - */ - virtual void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) = 0; /** * @deprecated method will be removed in 3.8.0 */ @@ -321,16 +305,10 @@ class RasterPassBuilder : public Setter { */ virtual void addComputeView(const ccstd::string &name, const ComputeView &view) = 0; virtual RasterQueueBuilder *addQueue(QueueHint hint, const ccstd::string &layoutName) = 0; - virtual RasterSubpassBuilder *addRasterSubpass(const ccstd::string &layoutName) = 0; - virtual ComputeSubpassBuilder *addComputeSubpass(const ccstd::string &layoutName) = 0; virtual void setViewport(const gfx::Viewport &viewport) = 0; virtual void setVersion(const ccstd::string &name, uint64_t version) = 0; virtual bool getShowStatistics() const = 0; virtual void setShowStatistics(bool enable) = 0; - /** - * @beta method's name might change - */ - virtual void setCustomShaderStages(const ccstd::string &name, gfx::ShaderStageFlagBit stageFlags) = 0; void addRenderTarget(const ccstd::string &name, const ccstd::string &slotName) { addRenderTarget(name, slotName, gfx::LoadOp::CLEAR, gfx::StoreOp::STORE, {}); } @@ -361,6 +339,32 @@ class RasterPassBuilder : public Setter { RasterQueueBuilder *addQueue(QueueHint hint) { return addQueue(hint, ""); } +}; + +class RasterPassBuilder : public BasicRenderPassBuilder { +public: + RasterPassBuilder() noexcept = default; + + virtual void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType, const ClearValue &clearValue) = 0; + virtual void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType, const ClearValue &clearValue) = 0; + virtual RasterSubpassBuilder *addRasterSubpass(const ccstd::string &layoutName) = 0; + virtual ComputeSubpassBuilder *addComputeSubpass(const ccstd::string &layoutName) = 0; + /** + * @beta function signature might change + */ + virtual void setCustomShaderStages(const ccstd::string &name, gfx::ShaderStageFlagBit stageFlags) = 0; + void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) { + addStorageBuffer(name, accessType, slotName, ClearValueType::NONE, {}); + } + void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType) { + addStorageBuffer(name, accessType, slotName, clearType, {}); + } + void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) { + addStorageImage(name, accessType, slotName, ClearValueType::NONE, {}); + } + void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType) { + addStorageImage(name, accessType, slotName, clearType, {}); + } RasterSubpassBuilder *addRasterSubpass() { return addRasterSubpass(""); } @@ -373,27 +377,30 @@ class ComputePassBuilder : public Setter { public: ComputePassBuilder() noexcept = default; - /** - * @beta method's name might change - */ virtual void addTexture(const ccstd::string &name, const ccstd::string &slotName) = 0; - /** - * @beta method's name might change - */ - virtual void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) = 0; - /** - * @beta method's name might change - */ - virtual void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) = 0; + virtual void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType, const ClearValue &clearValue) = 0; + virtual void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType, const ClearValue &clearValue) = 0; /** * @deprecated method will be removed in 3.8.0 */ virtual void addComputeView(const ccstd::string &name, const ComputeView &view) = 0; virtual ComputeQueueBuilder *addQueue(const ccstd::string &layoutName) = 0; /** - * @beta method's name might change + * @beta function signature might change */ virtual void setCustomShaderStages(const ccstd::string &name, gfx::ShaderStageFlagBit stageFlags) = 0; + void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) { + addStorageBuffer(name, accessType, slotName, ClearValueType::NONE, {}); + } + void addStorageBuffer(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType) { + addStorageBuffer(name, accessType, slotName, clearType, {}); + } + void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName) { + addStorageImage(name, accessType, slotName, ClearValueType::NONE, {}); + } + void addStorageImage(const ccstd::string &name, AccessType accessType, const ccstd::string &slotName, ClearValueType clearType) { + addStorageImage(name, accessType, slotName, clearType, {}); + } ComputeQueueBuilder *addQueue() { return addQueue(""); } @@ -459,10 +466,16 @@ class SceneTransversal { virtual SceneTask *transverse(SceneVisitor *visitor) const = 0; }; -class Pipeline : public PipelineRuntime { +enum class PipelineType { + BASIC, + STANDARD, +}; + +class BasicPipeline : public PipelineRuntime { public: - Pipeline() noexcept = default; + BasicPipeline() noexcept = default; + virtual PipelineType getPipelineType() const = 0; virtual void beginSetup() = 0; virtual void endSetup() = 0; virtual bool containsResource(const ccstd::string &name) const = 0; @@ -472,44 +485,56 @@ class Pipeline : public PipelineRuntime { virtual uint32_t addRenderTexture(const ccstd::string &name, gfx::Format format, uint32_t width, uint32_t height, scene::RenderWindow *renderWindow) = 0; virtual uint32_t addRenderWindow(const ccstd::string &name, gfx::Format format, uint32_t width, uint32_t height, scene::RenderWindow *renderWindow) = 0; virtual void updateRenderWindow(const ccstd::string &name, scene::RenderWindow *renderWindow) = 0; - virtual uint32_t addStorageBuffer(const ccstd::string &name, gfx::Format format, uint32_t size, ResourceResidency residency) = 0; virtual uint32_t addRenderTarget(const ccstd::string &name, gfx::Format format, uint32_t width, uint32_t height, ResourceResidency residency) = 0; virtual uint32_t addDepthStencil(const ccstd::string &name, gfx::Format format, uint32_t width, uint32_t height, ResourceResidency residency) = 0; - virtual uint32_t addStorageTexture(const ccstd::string &name, gfx::Format format, uint32_t width, uint32_t height, ResourceResidency residency) = 0; - virtual uint32_t addShadingRateTexture(const ccstd::string &name, uint32_t width, uint32_t height, ResourceResidency residency) = 0; - /** - * @beta method's name might change - */ - virtual uint32_t addCustomBuffer(const ccstd::string &name, const gfx::BufferInfo &info, const std::string &type) = 0; - /** - * @beta method's name might change - */ - virtual uint32_t addCustomTexture(const ccstd::string &name, const gfx::TextureInfo &info, const std::string &type) = 0; - virtual void updateStorageBuffer(const ccstd::string &name, uint32_t size, gfx::Format format) = 0; virtual void updateRenderTarget(const ccstd::string &name, uint32_t width, uint32_t height, gfx::Format format) = 0; virtual void updateDepthStencil(const ccstd::string &name, uint32_t width, uint32_t height, gfx::Format format) = 0; - virtual void updateStorageTexture(const ccstd::string &name, uint32_t width, uint32_t height, gfx::Format format) = 0; - virtual void updateShadingRateTexture(const ccstd::string &name, uint32_t width, uint32_t height) = 0; virtual void beginFrame() = 0; virtual void endFrame() = 0; - virtual RasterPassBuilder *addRasterPass(uint32_t width, uint32_t height, const ccstd::string &layoutName) = 0; - virtual ComputePassBuilder *addComputePass(const ccstd::string &layoutName) = 0; + virtual BasicRenderPassBuilder *addRasterPass(uint32_t width, uint32_t height, const ccstd::string &layoutName) = 0; virtual MovePassBuilder *addMovePass() = 0; virtual CopyPassBuilder *addCopyPass() = 0; - /** - * @deprecated method will be removed in 3.8.0 - */ - virtual SceneTransversal *createSceneTransversal(const scene::Camera *camera, const scene::RenderScene *scene) = 0; virtual gfx::DescriptorSetLayout *getDescriptorSetLayout(const ccstd::string &shaderName, UpdateFrequency freq) = 0; - uint32_t addStorageBuffer(const ccstd::string &name, gfx::Format format, uint32_t size) { - return addStorageBuffer(name, format, size, ResourceResidency::MANAGED); - } uint32_t addRenderTarget(const ccstd::string &name, gfx::Format format, uint32_t width, uint32_t height) { return addRenderTarget(name, format, width, height, ResourceResidency::MANAGED); } uint32_t addDepthStencil(const ccstd::string &name, gfx::Format format, uint32_t width, uint32_t height) { return addDepthStencil(name, format, width, height, ResourceResidency::MANAGED); } + void updateRenderTarget(const ccstd::string &name, uint32_t width, uint32_t height) { + updateRenderTarget(name, width, height, gfx::Format::UNKNOWN); + } + void updateDepthStencil(const ccstd::string &name, uint32_t width, uint32_t height) { + updateDepthStencil(name, width, height, gfx::Format::UNKNOWN); + } + BasicRenderPassBuilder *addRasterPass(uint32_t width, uint32_t height) { + return addRasterPass(width, height, "default"); + } +}; + +class Pipeline : public BasicPipeline { +public: + Pipeline() noexcept = default; + + virtual uint32_t addStorageBuffer(const ccstd::string &name, gfx::Format format, uint32_t size, ResourceResidency residency) = 0; + virtual uint32_t addStorageTexture(const ccstd::string &name, gfx::Format format, uint32_t width, uint32_t height, ResourceResidency residency) = 0; + virtual uint32_t addShadingRateTexture(const ccstd::string &name, uint32_t width, uint32_t height, ResourceResidency residency) = 0; + virtual void updateStorageBuffer(const ccstd::string &name, uint32_t size, gfx::Format format) = 0; + virtual void updateStorageTexture(const ccstd::string &name, uint32_t width, uint32_t height, gfx::Format format) = 0; + virtual void updateShadingRateTexture(const ccstd::string &name, uint32_t width, uint32_t height) = 0; + RasterPassBuilder *addRasterPass(uint32_t width, uint32_t height, const ccstd::string &layoutName) override = 0 /* covariant */; + virtual ComputePassBuilder *addComputePass(const ccstd::string &layoutName) = 0; + /** + * @beta function signature might change + */ + virtual uint32_t addCustomBuffer(const ccstd::string &name, const gfx::BufferInfo &info, const std::string &type) = 0; + /** + * @beta function signature might change + */ + virtual uint32_t addCustomTexture(const ccstd::string &name, const gfx::TextureInfo &info, const std::string &type) = 0; + uint32_t addStorageBuffer(const ccstd::string &name, gfx::Format format, uint32_t size) { + return addStorageBuffer(name, format, size, ResourceResidency::MANAGED); + } uint32_t addStorageTexture(const ccstd::string &name, gfx::Format format, uint32_t width, uint32_t height) { return addStorageTexture(name, format, width, height, ResourceResidency::MANAGED); } @@ -519,18 +544,9 @@ class Pipeline : public PipelineRuntime { void updateStorageBuffer(const ccstd::string &name, uint32_t size) { updateStorageBuffer(name, size, gfx::Format::UNKNOWN); } - void updateRenderTarget(const ccstd::string &name, uint32_t width, uint32_t height) { - updateRenderTarget(name, width, height, gfx::Format::UNKNOWN); - } - void updateDepthStencil(const ccstd::string &name, uint32_t width, uint32_t height) { - updateDepthStencil(name, width, height, gfx::Format::UNKNOWN); - } void updateStorageTexture(const ccstd::string &name, uint32_t width, uint32_t height) { updateStorageTexture(name, width, height, gfx::Format::UNKNOWN); } - RasterPassBuilder *addRasterPass(uint32_t width, uint32_t height) { - return addRasterPass(width, height, "default"); - } }; class PipelineBuilder { @@ -542,7 +558,7 @@ class PipelineBuilder { PipelineBuilder& operator=(PipelineBuilder const& rhs) = delete; virtual ~PipelineBuilder() noexcept = default; - virtual void setup(const ccstd::vector &cameras, Pipeline *pipeline) = 0; + virtual void setup(const ccstd::vector &cameras, BasicPipeline *pipeline) = 0; }; class RenderingModule { diff --git a/native/cocos/renderer/pipeline/custom/details/SerializationUtils.h b/native/cocos/renderer/pipeline/custom/details/SerializationUtils.h index 8ca44b8aec8..4f45f78fe13 100644 --- a/native/cocos/renderer/pipeline/custom/details/SerializationUtils.h +++ b/native/cocos/renderer/pipeline/custom/details/SerializationUtils.h @@ -64,19 +64,18 @@ template || std::is_floating_point_v, bool> = false> void load(InputArchive& ar, T& v) { - static_assert(sizeof(T) <= sizeof(uint32_t)); // enum can only be 1, 2, 4 bytes v = static_cast(ar.readNumber()); } // Cast from double to enum might not be supported. _MSC_VER(1924) template , + std::enable_if_t< + std::is_enum_v, bool> = false> void load(InputArchive& ar, T& v) { v = static_cast(static_cast::type>(ar.readNumber())); } - // string template void save(OutputArchive& ar, const std::basic_string& v) { diff --git a/native/cocos/renderer/pipeline/custom/test/test.h b/native/cocos/renderer/pipeline/custom/test/test.h index b958843a1ed..1ea5fcd1af7 100644 --- a/native/cocos/renderer/pipeline/custom/test/test.h +++ b/native/cocos/renderer/pipeline/custom/test/test.h @@ -77,7 +77,7 @@ static void fillTestGraph(const ViewInfo &rasterData, const ResourceInfo &rescIn add_vertex(layoutGraphData, RenderPhaseTag{}, ""); auto &layout = layoutGraphData.layouts.back(); - auto& descPair = layout.descriptorSets.emplace(UpdateFrequency::PER_PASS, DescriptorSetData{renderGraph.get_allocator()}); + auto &descPair = layout.descriptorSets.emplace(UpdateFrequency::PER_PASS, DescriptorSetData{renderGraph.get_allocator()}); auto &descData = (*descPair.first).second.descriptorSetLayoutData; for (size_t i = 0; i < layoutInfo.size(); ++i) { const ccstd::string passName = "pass" + std::to_string(i); @@ -93,7 +93,7 @@ static void fillTestGraph(const ViewInfo &rasterData, const ResourceInfo &rescIn stages[i].descriptorVisibility.emplace(NameLocalID{nameID}, shaderStage); auto &block = descData.descriptorBlocks.emplace_back(); block.visibility = shaderStage; - auto& desc = block.descriptors.emplace_back(); + auto &desc = block.descriptors.emplace_back(); desc.count = 1; desc.descriptorID = {nameID}; } @@ -110,6 +110,7 @@ static void fillTestGraph(const ViewInfo &rasterData, const ResourceInfo &rescIn bool hasSubpass = count > 1; Subpass *subpass = nullptr; + auto &rasterViews = raster.rasterViews; for (size_t j = 0; j < count; ++j) { assert(subpasses[j].size() == 2); // inputs and outputs @@ -117,12 +118,27 @@ static void fillTestGraph(const ViewInfo &rasterData, const ResourceInfo &rescIn bool isOutput = false; Subpass *subpass = nullptr; + PmrTransparentMap *subpassViews = nullptr; if (hasSubpass) { const ccstd::string subpassName = "subpass" + std::to_string(passID); auto subpassVertexID = add_vertex(subpassGraph, subpassName.c_str()); subpass = &get(SubpassGraph::SubpassTag{}, subpassGraph, subpassVertexID); + + RasterSubpass subpassNode(j, renderGraph.get_allocator()); + auto subpassID = addVertex( + RasterSubpassTag{}, + std::forward_as_tuple(subpassName.c_str()), + std::forward_as_tuple(), + std::forward_as_tuple(), + std::forward_as_tuple(), + std::forward_as_tuple(std::move(subpassNode)), + renderGraph, vertexID); + + auto *subpassNode1 = get_if(subpassID, &renderGraph); + subpassViews = &subpassNode1->rasterViews; } + uint32_t slot = 0; for (size_t k = 0; k < attachments.size(); ++k) { for (size_t l = 0; l < attachments[k].size(); ++l) { const auto &inputsOrOutputs = attachments[k]; @@ -133,16 +149,22 @@ static void fillTestGraph(const ViewInfo &rasterData, const ResourceInfo &rescIn } auto &rasterViews = hasSubpass ? (*subpass).rasterViews : raster.rasterViews; - rasterViews.emplace(viewName.c_str(), RasterView{ - viewName.c_str(), - isOutput ? AccessType::WRITE : AccessType::READ, - AttachmentType::RENDER_TARGET, - firstMeet ? gfx::LoadOp::CLEAR : gfx::LoadOp::LOAD, - gfx::StoreOp::STORE, - gfx::ClearFlagBit::ALL, - gfx::Color({1.0, 0.0, 0.0, 1.0}), - gfx::ShaderStageFlagBit::NONE, - }); + auto view = RasterView{ + viewName.c_str(), + isOutput ? AccessType::WRITE : AccessType::READ, + AttachmentType::RENDER_TARGET, + firstMeet ? gfx::LoadOp::CLEAR : gfx::LoadOp::LOAD, + gfx::StoreOp::STORE, + gfx::ClearFlagBit::ALL, + gfx::Color({1.0, 0.0, 0.0, 1.0}), + gfx::ShaderStageFlagBit::NONE, + }; + view.slotID = slot; + rasterViews.emplace(viewName.c_str(), view); + if (subpassViews) { + subpassViews->emplace(viewName.c_str(), view); + } + ++slot; } isOutput = true; } @@ -526,139 +548,162 @@ static void runTestGraph(const RenderGraph &renderGraph, const ResourceGraph &re framegraph.reset(); } -#define TEST_CASE_DEFINE \ - using namespace cc::render; \ - using cc::gfx::AccessFlagBit; \ - using cc::gfx::BarrierType; \ - using cc::gfx::Format; \ - using cc::gfx::MemoryAccessBit; \ - using cc::gfx::SampleCount; \ - using cc::gfx::ShaderStageFlagBit; \ - using cc::gfx::TextureFlagBit; \ - ResourceInfo resources = { \ - {"0", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::MANAGED}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"1", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::MANAGED}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"2", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::MANAGED}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"3", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::MANAGED}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"4", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::MANAGED}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"5", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::MANAGED}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"6", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::MANAGED}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"7", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::MANAGED}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"8", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::MANAGED}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"9", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::MANAGED}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"10", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::MANAGED}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"11", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::MANAGED}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"12", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::MANAGED}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"13", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::MANAGED}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"14", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::MANAGED}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"15", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::MANAGED}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"16", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::MANAGED}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"17", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::MANAGED}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"18", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::MANAGED}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"19", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::EXTERNAL}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"20", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::EXTERNAL}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"21", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::EXTERNAL}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ - {"22", \ - {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT}, \ - {ResourceResidency::BACKBUFFER}, \ - {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ +#define TEST_CASE_DEFINE \ + using namespace cc::render; \ + using cc::gfx::AccessFlagBit; \ + using cc::gfx::BarrierType; \ + using cc::gfx::Format; \ + using cc::gfx::MemoryAccessBit; \ + using cc::gfx::SampleCount; \ + using cc::gfx::ShaderStageFlagBit; \ + using cc::gfx::TextureFlagBit; \ + ResourceInfo resources = { \ + {"0", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::MANAGED}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"1", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::MANAGED}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"2", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::MANAGED}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"3", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::MANAGED}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"4", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::MANAGED}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"5", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::MANAGED}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"6", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::MANAGED}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"7", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::MANAGED}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"8", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::MANAGED}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"9", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::MANAGED}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"10", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::MANAGED}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"11", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::MANAGED}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"12", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::MANAGED}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"13", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::MANAGED}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"14", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::MANAGED}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"15", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::MANAGED}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"16", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::MANAGED}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"17", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::MANAGED}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"18", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::MANAGED}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"19", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::EXTERNAL}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"20", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::EXTERNAL}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"21", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::EXTERNAL}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ + {"22", \ + {ResourceDimension::TEXTURE2D, 4, 960, 640, 1, 0, Format::RGBA8, SampleCount::ONE, TextureFlagBit::NONE, \ + ResourceFlags::SAMPLED | ResourceFlags::COLOR_ATTACHMENT | ResourceFlags::INPUT_ATTACHMENT}, \ + {ResourceResidency::BACKBUFFER}, \ + {AccessFlagBit::FRAGMENT_SHADER_READ_TEXTURE | AccessFlagBit::COLOR_ATTACHMENT_WRITE}}, \ }; -#define TEST_CASE_1 \ - TEST_CASE_DEFINE \ - \ - ViewInfo rasterData = { \ - { \ - PassType::RASTER, \ - { \ - {{}, {"0", "1", "2"}}, \ - {{"0", "1", "2"}, {"3"}}, \ - }, \ - }, \ - { \ - PassType::RASTER, \ - { \ - {{"3"}, {"22"}}, \ - }, \ - }, \ - }; \ - \ - LayoutInfo layoutInfo = { \ - { \ - {"0", 0, cc::gfx::ShaderStageFlagBit::FRAGMENT}, \ - {"1", 1, cc::gfx::ShaderStageFlagBit::FRAGMENT}, \ - {"2", 2, cc::gfx::ShaderStageFlagBit::FRAGMENT}, \ - {"3", 3, cc::gfx::ShaderStageFlagBit::FRAGMENT}, \ - }, \ - { \ - {"3", 3, cc::gfx::ShaderStageFlagBit::FRAGMENT}, \ - {"22", 22, cc::gfx::ShaderStageFlagBit::FRAGMENT}, \ +#define TEST_CASE_1 \ + TEST_CASE_DEFINE \ + \ + ViewInfo rasterData = { \ + { \ + PassType::RASTER, \ + { \ + {{}, {"0", "1", "2"}}, \ + {{"0", "1", "2"}, {"3"}}, \ + }, \ + }, \ + { \ + PassType::RASTER, \ + { \ + {{"3"}, {"22"}}, \ + }, \ + }, \ + }; \ + \ + LayoutInfo layoutInfo = { \ + { \ + {"0", 0, cc::gfx::ShaderStageFlagBit::FRAGMENT}, \ + {"1", 1, cc::gfx::ShaderStageFlagBit::FRAGMENT}, \ + {"2", 2, cc::gfx::ShaderStageFlagBit::FRAGMENT}, \ + {"3", 3, cc::gfx::ShaderStageFlagBit::FRAGMENT}, \ + }, \ + { \ + {"3", 3, cc::gfx::ShaderStageFlagBit::FRAGMENT}, \ + {"22", 22, cc::gfx::ShaderStageFlagBit::FRAGMENT}, \ }}; #define TEST_CASE_2 \ diff --git a/native/tests/unit-test/src/complicated_barrier_case.cpp b/native/tests/unit-test/src/complicated_barrier_case.cpp index 35881c73b83..075fae281f9 100644 --- a/native/tests/unit-test/src/complicated_barrier_case.cpp +++ b/native/tests/unit-test/src/complicated_barrier_case.cpp @@ -58,26 +58,29 @@ TEST(complicatedBarrierTest, test12) { // 1st node const auto& node1 = barrierMap.at(1); - ExpectEq(node1.blockBarrier.frontBarriers.size() == 2, true); - ExpectEq(node1.blockBarrier.rearBarriers.size() == 1, true); + // block barrier: replace by rnderpass info, same below + //ExpectEq(node1.blockBarrier.frontBarriers.size() == 2, true); + //ExpectEq(node1.blockBarrier.rearBarriers.size() == 1, true); ExpectEq(node1.subpassBarriers.empty(), false); - //block barrier: what comes in and what comes out, no matter how many subpasses inside. - ExpectEq(node1.blockBarrier.rearBarriers[0].type == cc::gfx::BarrierType::FULL, true); - ExpectEq(node1.blockBarrier.rearBarriers[0].resourceID == 1, true); - ExpectEq(node1.blockBarrier.rearBarriers[0].beginStatus.vertID == 1, true); - ExpectEq(node1.blockBarrier.rearBarriers[0].beginStatus.access == MemoryAccessBit::WRITE_ONLY, true); - ExpectEq(node1.blockBarrier.rearBarriers[0].endStatus.vertID == 1, true); - ExpectEq(node1.blockBarrier.rearBarriers[0].endStatus.access == MemoryAccessBit::READ_ONLY, true); + //ExpectEq(node1.blockBarrier.rearBarriers[0].type == cc::gfx::BarrierType::FULL, true); + //ExpectEq(node1.blockBarrier.rearBarriers[0].resourceID == 1, true); + //ExpectEq(node1.blockBarrier.rearBarriers[0].beginStatus.vertID == 1, true); + //ExpectEq(node1.blockBarrier.rearBarriers[0].beginStatus.access == MemoryAccessBit::WRITE_ONLY, true); + //ExpectEq(node1.blockBarrier.rearBarriers[0].endStatus.vertID == 1, true); + //ExpectEq(node1.blockBarrier.rearBarriers[0].endStatus.access == MemoryAccessBit::READ_ONLY, true); //subpass barrier: like normal pass const auto& node1subpass = node1.subpassBarriers; - ExpectEq(node1subpass[0].frontBarriers.empty(), true); + ExpectEq(node1subpass[0].frontBarriers.empty(), false); ExpectEq(node1subpass[0].rearBarriers.size() == 1, true); + + // undefined external depends const auto& node1subpassres0 = node1subpass[0].rearBarriers[0]; ExpectEq(node1subpassres0.type == cc::gfx::BarrierType::FULL, true); ExpectEq(node1subpassres0.resourceID == 0, true); - ExpectEq(node1subpassres0.beginStatus.vertID == 1, true); + // vertid in subpass:subpass index, same below + ExpectEq(node1subpassres0.beginStatus.vertID == 0, true); ExpectEq(node1subpassres0.beginStatus.access == MemoryAccessBit::WRITE_ONLY, true); ExpectEq(node1subpassres0.beginStatus.passType == PassType::RASTER, true); ExpectEq(node1subpassres0.endStatus.vertID == 1, true); @@ -85,7 +88,7 @@ TEST(complicatedBarrierTest, test12) { ExpectEq(node1subpassres0.endStatus.access == MemoryAccessBit::READ_ONLY, true); ExpectEq(node1subpassres0.endStatus.passType == PassType::RASTER, true); - ExpectEq(node1subpass[1].frontBarriers.empty(), true); + ExpectEq(node1subpass[1].frontBarriers.size() == 1, true); const auto& node1subpassres1 = node1subpass[1].rearBarriers[0]; ExpectEq(node1subpassres1.type == cc::gfx::BarrierType::FULL, true); ExpectEq(node1subpassres1.resourceID == 1, true); @@ -99,32 +102,33 @@ TEST(complicatedBarrierTest, test12) { //node2 const auto& node2 = barrierMap.at(2); - ExpectEq(node2.blockBarrier.frontBarriers.size() == 2, true); - ExpectEq(node2.blockBarrier.rearBarriers.size() == 1, true); + //ExpectEq(node2.blockBarrier.frontBarriers.size() == 2, true); + //ExpectEq(node2.blockBarrier.rearBarriers.size() == 1, true); ExpectEq(node2.subpassBarriers.size() == 2, true); - const auto& node2blockRear = node2.blockBarrier.rearBarriers; - auto iter3in2 = findBarrierByResID(node2blockRear, 3); - const auto& res3in2 = (*iter3in2); - ExpectEq(res3in2.resourceID == 3, true); - ExpectEq(res3in2.type == cc::gfx::BarrierType::FULL, true); - ExpectEq(res3in2.beginStatus.vertID == 2, true); - ExpectEq(res3in2.beginStatus.passType == PassType::RASTER, true); - ExpectEq(res3in2.endStatus.vertID == 2, true); - ExpectEq(res3in2.endStatus.passType == PassType::RASTER, true); + //const auto& node2blockRear = node2.blockBarrier.rearBarriers; + //auto iter3in2 = findBarrierByResID(node2blockRear, 3); + //const auto& res3in2 = (*iter3in2); + //ExpectEq(res3in2.resourceID == 3, true); + //ExpectEq(res3in2.type == cc::gfx::BarrierType::FULL, true); + //ExpectEq(res3in2.beginStatus.vertID == 2, true); + //ExpectEq(res3in2.beginStatus.passType == PassType::RASTER, true); + //ExpectEq(res3in2.endStatus.vertID == 2, true); + //ExpectEq(res3in2.endStatus.passType == PassType::RASTER, true); const auto& node2subpass = node2.subpassBarriers; ExpectEq(node2subpass.empty(), false); - ExpectEq(node2subpass[0].frontBarriers.empty(), true); + // subpass dependency instead of extra barrier + ExpectEq(node2subpass[0].frontBarriers.size() == 1, true); ExpectEq(node2subpass[0].rearBarriers.empty(), false); const auto& node2subpassRes2 = node2subpass[0].rearBarriers[0]; ExpectEq(node2subpassRes2.type == cc::gfx::BarrierType::FULL, true); ExpectEq(node2subpassRes2.resourceID == 2, true); - ExpectEq(node2subpassRes2.beginStatus.vertID == 2, true); + ExpectEq(node2subpassRes2.beginStatus.vertID == 0, true); ExpectEq(node2subpassRes2.beginStatus.passType == PassType::RASTER, true); ExpectEq(node2subpassRes2.beginStatus.access == MemoryAccessBit::WRITE_ONLY, true); - ExpectEq(node2subpassRes2.endStatus.vertID == 2, true); + ExpectEq(node2subpassRes2.endStatus.vertID == 1, true); ExpectEq(node2subpassRes2.endStatus.access == MemoryAccessBit::READ_ONLY, true); //node3 @@ -143,39 +147,42 @@ TEST(complicatedBarrierTest, test12) { //node4 const auto& node4 = barrierMap.at(4); - ExpectEq(node4.blockBarrier.frontBarriers.size() == 2, true); - ExpectEq(node4.blockBarrier.rearBarriers.size() == 1, true); + //ExpectEq(node4.blockBarrier.frontBarriers.size() == 2, true); + //ExpectEq(node4.blockBarrier.rearBarriers.size() == 1, true); ExpectEq(node4.subpassBarriers.empty(), false); - const auto& node4block = node4.blockBarrier; - auto iter5in4 = findBarrierByResID(node4block.rearBarriers, 5); - ExpectEq(iter5in4 == node4block.rearBarriers.end(), true); + //const auto& node4block = node4.blockBarrier; + //auto iter5in4 = findBarrierByResID(node4block.rearBarriers, 5); + //ExpectEq(iter5in4 == node4block.rearBarriers.end(), true); - auto iter6in4 = findBarrierByResID(node4block.rearBarriers, 6); - ExpectEq(iter6in4 != node4block.rearBarriers.end(), true); - ExpectEq((*iter6in4).type == cc::gfx::BarrierType::SPLIT_BEGIN, true); - ExpectEq((*iter6in4).resourceID == 6, true); - ExpectEq((*iter6in4).beginStatus.vertID == 4, true); - ExpectEq((*iter6in4).endStatus.vertID == 14, true); + //auto iter6in4 = findBarrierByResID(node4block.rearBarriers, 6); + //ExpectEq(iter6in4 != node4block.rearBarriers.end(), true); + //ExpectEq((*iter6in4).type == cc::gfx::BarrierType::SPLIT_BEGIN, true); + //ExpectEq((*iter6in4).resourceID == 6, true); + //ExpectEq((*iter6in4).beginStatus.vertID == 4, true); + //ExpectEq((*iter6in4).endStatus.vertID == 14, true); const auto& node4subpass0 = node4.subpassBarriers[0]; - ExpectEq(node4subpass0.frontBarriers.empty(), true); + // subpass undefined external depends + ExpectEq(node4subpass0.frontBarriers.empty(), false); ExpectEq(node4subpass0.rearBarriers.size() == 1, true); ExpectEq(node4subpass0.rearBarriers[0].type == cc::gfx::BarrierType::FULL, true); ExpectEq(node4subpass0.rearBarriers[0].resourceID == 5, true); - ExpectEq(node4subpass0.rearBarriers[0].beginStatus.vertID == 4, true); + ExpectEq(node4subpass0.rearBarriers[0].beginStatus.vertID == 0, true); ExpectEq(node4subpass0.rearBarriers[0].beginStatus.access == MemoryAccessBit::WRITE_ONLY, true); - ExpectEq(node4subpass0.rearBarriers[0].endStatus.vertID == 4, true); + ExpectEq(node4subpass0.rearBarriers[0].endStatus.vertID == 1, true); ExpectEq(node4subpass0.rearBarriers[0].endStatus.access == MemoryAccessBit::READ_ONLY, true); const auto& node4subpass1 = node4.subpassBarriers[1]; - ExpectEq(node4subpass1.frontBarriers.empty(), true); + ExpectEq(node4subpass1.frontBarriers.empty(), false); ExpectEq(node4subpass1.rearBarriers.size() == 1, true); ExpectEq(node4subpass1.rearBarriers[0].type == cc::gfx::BarrierType::SPLIT_BEGIN, true); ExpectEq(node4subpass1.rearBarriers[0].resourceID == 6, true); - ExpectEq(node4subpass1.rearBarriers[0].beginStatus.vertID == 4, true); + // external subpass depends + ExpectEq(node4subpass1.rearBarriers[0].beginStatus.vertID == 0xFFFFFFFF, true); ExpectEq(node4subpass1.rearBarriers[0].beginStatus.access == MemoryAccessBit::WRITE_ONLY, true); - ExpectEq(node4subpass1.rearBarriers[0].endStatus.vertID == 14, true); + // external subpass depends + ExpectEq(node4subpass1.rearBarriers[0].endStatus.vertID == 0xFFFFFFFF, true); ExpectEq(node4subpass1.rearBarriers[0].endStatus.access == MemoryAccessBit::READ_ONLY, true); const auto& node5 = barrierMap.at(5); diff --git a/native/tests/unit-test/src/simple_barrier_test.cpp b/native/tests/unit-test/src/simple_barrier_test.cpp index c26b8559b4b..31e5913a3f6 100644 --- a/native/tests/unit-test/src/simple_barrier_test.cpp +++ b/native/tests/unit-test/src/simple_barrier_test.cpp @@ -51,20 +51,22 @@ TEST(barrierTest, test10) { // 1st node const auto& node1 = barrierMap.at(1); - ExpectEq(node1.blockBarrier.frontBarriers.size() == 4, true); - ExpectEq(node1.blockBarrier.rearBarriers.size() == 1, true); + //ExpectEq(node1.blockBarrier.frontBarriers.size() == 4, true); + //ExpectEq(node1.blockBarrier.rearBarriers.size() == 1, true); - ExpectEq(node1.subpassBarriers[0].frontBarriers.empty(), true); + // undefined external + ExpectEq(node1.subpassBarriers[0].frontBarriers.size() == 3, true); ExpectEq(node1.subpassBarriers[0].rearBarriers.size() == 3, true); - ExpectEq(node1.subpassBarriers[1].frontBarriers.empty(), true); + // undefined external + ExpectEq(node1.subpassBarriers[1].frontBarriers.size() == 1, true); ExpectEq(node1.subpassBarriers[1].rearBarriers.size() == 1, true); - const auto& barrier = node1.blockBarrier.rearBarriers[0]; - ExpectEq(barrier.type == BarrierType::FULL, true); - ExpectEq(barrier.beginStatus.access == MemoryAccessBit::WRITE_ONLY, true); - //resID 3 - ExpectEq(barrier.beginStatus.visibility == std::get<2>(layoutInfo[0][3]), true); + //const auto& barrier = node1.blockBarrier.rearBarriers[0]; + //ExpectEq(barrier.type == BarrierType::FULL, true); + //ExpectEq(barrier.beginStatus.access == MemoryAccessBit::WRITE_ONLY, true); + ////resID 3 + //ExpectEq(barrier.beginStatus.visibility == std::get<2>(layoutInfo[0][3]), true); //// 2nd node const auto& node2 = barrierMap.at(2); diff --git a/native/tools/swig-config/renderer.i b/native/tools/swig-config/renderer.i index 56380f1ba30..9ee4c96aecc 100644 --- a/native/tools/swig-config/renderer.i +++ b/native/tools/swig-config/renderer.i @@ -103,9 +103,10 @@ using namespace cc::render; %attribute(cc::render::PipelineRuntime, float, shadingScale, getShadingScale, setShadingScale); %attribute(cc::render::RenderNode, ccstd::string, name, getName, setName); %attribute(cc::render::RasterSubpassBuilder, bool, showStatistics, getShowStatistics, setShowStatistics); -%attribute(cc::render::RasterPassBuilder, bool, showStatistics, getShowStatistics, setShowStatistics); +%attribute(cc::render::BasicRenderPassBuilder, bool, showStatistics, getShowStatistics, setShowStatistics); %attribute(cc::render::SceneVisitor, cc::pipeline::PipelineSceneData*, pipelineSceneData, getPipelineSceneData); %attribute(cc::render::SceneTask, cc::render::TaskType, taskType, getTaskType); +%attribute(cc::render::BasicPipeline, cc::render::PipelineType, pipelineType, getPipelineType); // ----- Import Section ------ // Brief: Import header files which are depended by 'Include Section' diff --git a/pal/pacer/pacer-web.ts b/pal/pacer/pacer-web.ts index aa5a5ca6eed..0d0ff42947e 100644 --- a/pal/pacer/pacer-web.ts +++ b/pal/pacer/pacer-web.ts @@ -22,26 +22,28 @@ THE SOFTWARE. */ +import { EDITOR } from 'internal:constants'; import { assertIsTrue } from '../../cocos/core/data/utils/asserts'; -import { clearTimeoutRAF, setTimeoutRAF } from '../utils'; export class Pacer { - private _rafHandle = 0; private _stHandle = 0; private _onTick: (() => void) | null = null; private _targetFrameRate = 60; private _frameTime = 0; private _startTime = 0; private _isPlaying = false; + private _callback: (() => void) | null = null; + private _delay = 0; + private _start = 0; private _rAF: typeof requestAnimationFrame; private _cAF: typeof cancelAnimationFrame; + constructor () { this._rAF = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame - || window.msRequestAnimationFrame - || this._stTime.bind(this); + || window.msRequestAnimationFrame; this._cAF = window.cancelAnimationFrame || window.cancelRequestAnimationFrame || window.msCancelRequestAnimationFrame @@ -51,8 +53,7 @@ export class Pacer { || window.msCancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame - || window.ocancelAnimationFrame - || this._ctTime.bind(this); + || window.ocancelAnimationFrame; } get targetFrameRate (): number { @@ -81,49 +82,55 @@ export class Pacer { start (): void { if (this._isPlaying) return; - if (this._targetFrameRate === 60) { - const updateCallback = () => { - if (this._isPlaying) { - this._rafHandle = this._rAF.call(window, updateCallback); - } - if (this._onTick) { - this._onTick(); - } - }; - this._rafHandle = this._rAF.call(window, updateCallback); - } else { - const updateCallback = () => { - this._startTime = performance.now(); - if (this._isPlaying) { - this._stHandle = this._stTime(updateCallback); - } - if (this._onTick) { - this._onTick(); - } - }; + + const updateCallback = () => { this._startTime = performance.now(); - this._stHandle = this._stTime(updateCallback); - } + if (this._isPlaying) { + this._stHandle = this._stTime(updateCallback); + } + if (this._onTick) { + this._onTick(); + } + }; + this._startTime = performance.now(); + this._stHandle = this._stTime(updateCallback); + this._isPlaying = true; } stop (): void { if (!this._isPlaying) return; - this._cAF.call(window, this._rafHandle); this._ctTime(this._stHandle); - this._rafHandle = this._stHandle = 0; + this._stHandle = 0; this._isPlaying = false; } + _handleRAF = () => { + if (performance.now() - this._start < this._delay) { + this._rAF.call(window, this._handleRAF); + } else if (this._callback) { + this._callback(); + } + }; + private _stTime (callback: () => void) { const currTime = performance.now(); const elapseTime = Math.max(0, (currTime - this._startTime)); const timeToCall = Math.max(0, this._frameTime - elapseTime); - const id = setTimeoutRAF(callback, timeToCall); - return id; + if (EDITOR || this._rAF === undefined || globalThis.__globalXR?.isWebXR) { + return setTimeout(callback, timeToCall); + } + this._start = currTime; + this._delay = timeToCall; + this._callback = callback; + return this._rAF.call(window, this._handleRAF); } private _ctTime (id: number | undefined) { - clearTimeoutRAF(id); + if (EDITOR || this._cAF === undefined || globalThis.__globalXR?.isWebXR) { + clearTimeout(id); + } else if (id) { + this._cAF.call(window, id); + } } } diff --git a/pal/utils.ts b/pal/utils.ts index 4e7b1f67e07..3d0c14e0ce6 100644 --- a/pal/utils.ts +++ b/pal/utils.ts @@ -22,8 +22,10 @@ THE SOFTWARE. */ +import { EDITOR } from 'internal:constants'; + /** - * This method clones methods in minigame enviroment, sucb as `wx`, `swan` etc. to a module called minigame. + * This method clones methods in minigame environment, sub as `wx`, `swan` etc. to a module called minigame. * @param targetObject Usually it's specified as the minigame module. * @param originObj Original minigame environment such as `wx`, `swan` etc. */ @@ -199,7 +201,7 @@ export function setTimeoutRAF (callback: (...args: any[]) => void, delay: number || window.oRequestAnimationFrame || window.msRequestAnimationFrame; - if (raf === undefined || globalThis.__globalXR?.isWebXR) { + if (EDITOR || raf === undefined || globalThis.__globalXR?.isWebXR) { return setTimeout(callback, delay, ...args); } @@ -220,15 +222,20 @@ export function setTimeoutRAF (callback: (...args: any[]) => void, delay: number * @returns Nothing. */ export function clearTimeoutRAF (id) { - const raf = requestAnimationFrame - || window.requestAnimationFrame - || window.webkitRequestAnimationFrame - || window.mozRequestAnimationFrame - || window.oRequestAnimationFrame - || window.msRequestAnimationFrame; - if (raf === undefined || globalThis.__globalXR?.isWebXR) { + const caf = cancelAnimationFrame + || window.cancelAnimationFrame + || window.cancelRequestAnimationFrame + || window.msCancelRequestAnimationFrame + || window.mozCancelRequestAnimationFrame + || window.oCancelRequestAnimationFrame + || window.webkitCancelRequestAnimationFrame + || window.msCancelAnimationFrame + || window.mozCancelAnimationFrame + || window.webkitCancelAnimationFrame + || window.ocancelAnimationFrame; + if (EDITOR || caf === undefined || globalThis.__globalXR?.isWebXR) { clearTimeout(id); } else { - cancelAnimationFrame(id); + caf(id); } } diff --git a/tests/animation/value-proxies/uniform.test.ts b/tests/animation/value-proxies/uniform.test.ts new file mode 100644 index 00000000000..44fbe952acc --- /dev/null +++ b/tests/animation/value-proxies/uniform.test.ts @@ -0,0 +1,139 @@ +import { Track, UniformProxyFactory, VectorTrack } from "../../../cocos/animation/animation"; +import { AnimationClip } from "../../../cocos/animation/animation-clip"; +import { AnimationState } from "../../../cocos/animation/animation-state"; +import { Pass } from "../../../cocos/render-scene"; +import { Component, Node } from "../../../cocos/scene-graph"; +import { director, EffectAsset, js, Material, Vec3 } from "../../../exports/base"; +import { captureWarnIDs } from "../../utils/log-capture"; + +describe(`Error sentences`, () => { + beforeAll(() => js.setClassName('MaterialHost', MaterialHost)); + afterAll(() => js.unregisterClass(MaterialHost)); + + test(`Warn if input target is not a material`, () => { + const origin = new Node('SomeOrigin'); + const materialHost = origin.addComponent(MaterialHost) as MaterialHost; + + const track = new VectorTrack(); + track.channels()[0].curve.assignSorted([[0.0, 0.0]]); + track.path.toComponent(MaterialHost); + track.proxy = new UniformProxyFactory(); + + bindThenAssertWarn(origin, track, [3940, materialHost]); + }); + + test(`Warn if recorded pass index is invalid`, () => { + const origin = new Node('SomeOrigin'); + const materialHost = origin.addComponent(MaterialHost) as MaterialHost; + const material = materialHost.material = mockMaterial([ + { uniforms: {} }, + { uniforms: {} }, + { uniforms: {} }, + ]); + material.name = 'SomeMaterial'; + + const track = new VectorTrack(); + track.channels()[0].curve.assignSorted([[0.0, 0.0]]); + track.path.toComponent(MaterialHost).toProperty('material'); + + const proxyFactory = track.proxy = new UniformProxyFactory(); + for (const passIndex of [-2, -1, 3, 4]) { + proxyFactory.passIndex = passIndex; + bindThenAssertWarn(origin, track, [3941, material.name, proxyFactory.passIndex]); + } + }); + + test(`Warn if recorded uniform name is in invalid`, () => { + const origin = new Node('SomeOrigin'); + const materialHost = origin.addComponent(MaterialHost) as MaterialHost; + const material = materialHost.material = mockMaterial([ + { uniforms: { 'SomeUniform': { availableChannelCount: 3 } } }, + { uniforms: {} }, + { uniforms: {} }, + ]); + material.name = 'SomeMaterial'; + + const track = new VectorTrack(); + track.channels()[0].curve.assignSorted([[0.0, 0.0]]); + track.path.toComponent(MaterialHost).toProperty('material'); + const proxyFactory = track.proxy = new UniformProxyFactory(); + proxyFactory.passIndex = 1; + proxyFactory.uniformName = 'SomeUniform'; + proxyFactory.channelIndex = 4; + + bindThenAssertWarn(origin, track, [3942, material.name, proxyFactory.passIndex, proxyFactory.uniformName]); + }); + + test(`Warn if recorded channel index is invalid`, () => { + const origin = new Node('SomeOrigin'); + const materialHost = origin.addComponent(MaterialHost) as MaterialHost; + const material = materialHost.material = mockMaterial([ + { uniforms: {} }, + { uniforms: { 'SomeUniform': { availableChannelCount: 3 } } }, + { uniforms: {} }, + ]); + material.name = 'SomeMaterial'; + + const track = new VectorTrack(); + track.channels()[0].curve.assignSorted([[0.0, 0.0]]); + track.path.toComponent(MaterialHost).toProperty('material'); + const proxyFactory = track.proxy = new UniformProxyFactory(); + proxyFactory.passIndex = 1; + proxyFactory.uniformName = 'SomeUniform'; + + for (const channelIndex of [-1, -2, 3, 4]) { + proxyFactory.channelIndex = channelIndex; + bindThenAssertWarn(origin, track, [3943, material.name, proxyFactory.passIndex, proxyFactory.uniformName, proxyFactory.channelIndex]); + } + }); + + class MaterialHost extends Component { + public declare material: Material; + } + + function bindThenAssertWarn( + root: Node, + track: Track, + expectedCapturedWarns: [warnId: number, ...optionalParams: any[]] + ) { + const animationClip = new AnimationClip(); + animationClip.name = 'Meow'; + animationClip.duration = 1.0; + animationClip.addTrack(track); + + const warnWatcher = captureWarnIDs(); + + const state = new AnimationState(animationClip); + state.initialize(root); + + expect(warnWatcher.captured).toHaveLength(2); + expect(warnWatcher.captured[0]).toStrictEqual(expectedCapturedWarns); + expect(warnWatcher.captured[1]).toStrictEqual([3937, 'Meow', root.name]); + warnWatcher.clear(); + warnWatcher.stop(); + } + + function mockMaterial(passMocks: Array<{ + uniforms: Record; + }>) { + const passes = passMocks.map((passMock) => { + const pass = new Pass(director.root!); + jest.spyOn(pass, 'getHandle').mockImplementation((name, offset) => { + const uniformMock = passMock.uniforms[name]; + if (!uniformMock) { + return 0; + } + if (typeof offset !== 'undefined' && (offset < 0 || offset >= uniformMock.availableChannelCount)) { + return 0; + } + return 1; + }); + return pass; + }); + + const material = new Material(); + jest.spyOn(material, 'passes', 'get').mockReturnValue(passes); + + return material; + } +}); \ No newline at end of file