Skip to content

Commit 656b479

Browse files
committed
Improve autoRenderToScreen setup
and report potential configuration issue
1 parent 0704c34 commit 656b479

File tree

1 file changed

+44
-20
lines changed

1 file changed

+44
-20
lines changed

src/core/io/IOManager.ts

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -139,61 +139,85 @@ export class IOManager {
139139
}
140140

141141
/**
142-
* Updates the output buffers of all passes in a given pipeline.
142+
* Restores the original output buffers.
143143
*
144-
* @param pipeline - The pipeline to update.
144+
* @param passes - The passes to update.
145145
*/
146146

147-
private updateOutput(pipeline: RenderPipeline): void {
148-
149-
const passes = pipeline.passes.filter(x => x.enabled);
147+
private restoreOutputBuffers(passes: Pass<Material | null>[]): void {
150148

151-
for(let i = 0, j = 1, l = passes.length; i < l; ++i, ++j) {
149+
const outputDefaultBuffers = this.outputDefaultBuffers;
152150

153-
const pass = passes[i];
151+
for(const pass of passes) {
154152

155153
if(pass.output.defaultBuffer === null) {
156154

157155
continue;
158156

159157
}
160158

161-
const outputDefaultBuffers = this.outputDefaultBuffers;
162-
163159
if(outputDefaultBuffers.has(pass.output.defaultBuffer)) {
164160

165-
// Restore the original buffer.
166161
const originalBuffer = outputDefaultBuffers.get(pass.output.defaultBuffer)!;
167162
outputDefaultBuffers.delete(pass.output.defaultBuffer);
168163
pass.output.defaultBuffer = originalBuffer;
169164

170165
}
171166

172-
if(pipeline.autoRenderToScreen && j === l && pass.output.defaultBuffer !== null) {
167+
}
168+
169+
}
170+
171+
/**
172+
* Updates the output buffers of all passes in a given pipeline.
173+
*
174+
* @param pipeline - The pipeline to update.
175+
*/
176+
177+
private updateOutput(pipeline: RenderPipeline): void {
178+
179+
const passes = pipeline.passes.filter(x => x.enabled);
180+
181+
if(pipeline.autoRenderToScreen && passes.length > 0) {
182+
183+
this.restoreOutputBuffers(passes);
184+
185+
const outputDefaultBuffers = this.outputDefaultBuffers;
186+
const lastPass = passes[passes.length - 1];
187+
188+
if(lastPass.output.defaultBuffer !== null) {
173189

174190
// Remember the original buffer and set the default buffer to null.
175-
outputDefaultBuffers.set(pass.output.defaultBuffer, pass.output.defaultBuffer.value);
176-
pass.output.defaultBuffer = null;
191+
outputDefaultBuffers.set(lastPass.output.defaultBuffer, lastPass.output.defaultBuffer.value);
192+
lastPass.output.defaultBuffer = null;
193+
194+
if(passes.filter(x => x.output.defaultBuffer === lastPass.output.defaultBuffer).length > 1) {
195+
196+
console.warn("Encountered multiple passes that use the same default output buffer");
197+
198+
}
177199

178200
}
179201

180202
}
181203

182204
// Connect clear passes with subsequent passes.
183-
for(let i = 0, j = 1, l = passes.length; i < l; ++i, ++j) {
205+
for(let i = 0, j = 1, l = passes.length; j < l; ++i, ++j) {
184206

185207
const pass = passes[i];
186208

187-
if(j < l && pass instanceof ClearPass) {
209+
if(!(pass instanceof ClearPass)) {
188210

189-
// Assign the output resources of the next pass to this clear pass.
190-
const nextPass = passes[j];
191-
nextPass.output.defines.forEach((value, key) => pass.output.defines.set(key, value));
192-
nextPass.output.uniforms.forEach((value, key) => pass.output.uniforms.set(key, value));
193-
pass.output.defaultBuffer = nextPass.output.defaultBuffer;
211+
continue;
194212

195213
}
196214

215+
// Assign the output resources of the next pass to this clear pass.
216+
const nextPass = passes[j];
217+
nextPass.output.defines.forEach((value, key) => pass.output.defines.set(key, value));
218+
nextPass.output.uniforms.forEach((value, key) => pass.output.uniforms.set(key, value));
219+
pass.output.defaultBuffer = nextPass.output.defaultBuffer;
220+
197221
}
198222

199223
}

0 commit comments

Comments
 (0)