123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- import { WebGPUCacheRenderPipelineTree } from "./webgpuCacheRenderPipelineTree.js";
- import { WebGPUShaderProcessingContext } from "./webgpuShaderProcessingContext.js";
- import { WebGPUTextureHelper } from "./webgpuTextureHelper.js";
- import { renderableTextureFormatToIndex } from "./webgpuTextureManager.js";
- import "../../ShadersWGSL/clearQuad.vertex.js";
- import "../../ShadersWGSL/clearQuad.fragment.js";
- import { ShaderLanguage } from "../../Materials/shaderLanguage.js";
- /** @internal */
- export class WebGPUClearQuad {
- setDepthStencilFormat(format) {
- this._depthTextureFormat = format;
- this._cacheRenderPipeline.setDepthStencilFormat(format);
- }
- setColorFormat(format) {
- this._cacheRenderPipeline.setColorFormat(format);
- }
- setMRTAttachments(attachments, textureArray, textureCount) {
- this._cacheRenderPipeline.setMRT(textureArray, textureCount);
- this._cacheRenderPipeline.setMRTAttachments(attachments);
- }
- constructor(device, engine, emptyVertexBuffer) {
- this._bindGroups = {};
- this._bundleCache = {};
- this._keyTemp = [];
- this._device = device;
- this._engine = engine;
- this._cacheRenderPipeline = new WebGPUCacheRenderPipelineTree(this._device, emptyVertexBuffer);
- this._cacheRenderPipeline.setDepthTestEnabled(false);
- this._cacheRenderPipeline.setStencilReadMask(0xff);
- this._effect = engine.createEffect("clearQuad", [], ["color", "depthValue"], undefined, undefined, undefined, undefined, undefined, undefined, ShaderLanguage.WGSL);
- }
- clear(renderPass, clearColor, clearDepth, clearStencil, sampleCount = 1) {
- let renderPass2;
- let bundle = null;
- let bundleKey;
- const isRTTPass = !!this._engine._currentRenderTarget;
- if (renderPass) {
- renderPass2 = renderPass;
- }
- else {
- let idx = 0;
- this._keyTemp.length = 0;
- for (let i = 0; i < this._cacheRenderPipeline.colorFormats.length; ++i) {
- this._keyTemp[idx++] = renderableTextureFormatToIndex[this._cacheRenderPipeline.colorFormats[i] ?? ""];
- }
- const depthStencilFormatIndex = renderableTextureFormatToIndex[this._depthTextureFormat ?? 0];
- this._keyTemp[idx] =
- (clearColor ? clearColor.r + clearColor.g * 256 + clearColor.b * 256 * 256 + clearColor.a * 256 * 256 * 256 : 0) +
- (clearDepth ? 2 ** 32 : 0) +
- (clearStencil ? 2 ** 33 : 0) +
- (this._engine.useReverseDepthBuffer ? 2 ** 34 : 0) +
- (isRTTPass ? 2 ** 35 : 0) +
- (sampleCount > 1 ? 2 ** 36 : 0) +
- depthStencilFormatIndex * 2 ** 37;
- bundleKey = this._keyTemp.join("_");
- bundle = this._bundleCache[bundleKey];
- if (bundle) {
- return bundle;
- }
- renderPass2 = this._device.createRenderBundleEncoder({
- label: "clearQuadRenderBundle",
- colorFormats: this._cacheRenderPipeline.colorFormats,
- depthStencilFormat: this._depthTextureFormat,
- sampleCount: WebGPUTextureHelper.GetSample(sampleCount),
- });
- }
- this._cacheRenderPipeline.setDepthWriteEnabled(!!clearDepth);
- this._cacheRenderPipeline.setStencilEnabled(!!clearStencil && !!this._depthTextureFormat && WebGPUTextureHelper.HasStencilAspect(this._depthTextureFormat));
- this._cacheRenderPipeline.setStencilWriteMask(clearStencil ? 0xff : 0);
- this._cacheRenderPipeline.setStencilCompare(clearStencil ? 519 : 512);
- this._cacheRenderPipeline.setStencilPassOp(clearStencil ? 7681 : 7680);
- this._cacheRenderPipeline.setWriteMask(clearColor ? 0xf : 0);
- const pipeline = this._cacheRenderPipeline.getRenderPipeline(7, this._effect, sampleCount);
- const webgpuPipelineContext = this._effect._pipelineContext;
- if (clearColor) {
- this._effect.setDirectColor4("color", clearColor);
- }
- this._effect.setFloat("depthValue", this._engine.useReverseDepthBuffer ? this._engine._clearReverseDepthValue : this._engine._clearDepthValue);
- webgpuPipelineContext.uniformBuffer.update();
- const bufferInternals = isRTTPass ? this._engine._ubInvertY : this._engine._ubDontInvertY;
- const bufferLeftOver = webgpuPipelineContext.uniformBuffer.getBuffer();
- const key = bufferLeftOver.uniqueId + "-" + bufferInternals.uniqueId;
- let bindGroups = this._bindGroups[key];
- if (!bindGroups) {
- const bindGroupLayouts = webgpuPipelineContext.bindGroupLayouts[0];
- bindGroups = this._bindGroups[key] = [];
- bindGroups.push(this._device.createBindGroup({
- label: `clearQuadBindGroup0-${key}`,
- layout: bindGroupLayouts[0],
- entries: [],
- }));
- if (!WebGPUShaderProcessingContext._SimplifiedKnownBindings) {
- bindGroups.push(this._device.createBindGroup({
- label: `clearQuadBindGroup1-${key}`,
- layout: bindGroupLayouts[1],
- entries: [],
- }));
- }
- bindGroups.push(this._device.createBindGroup({
- label: `clearQuadBindGroup${WebGPUShaderProcessingContext._SimplifiedKnownBindings ? 1 : 2}-${key}`,
- layout: bindGroupLayouts[WebGPUShaderProcessingContext._SimplifiedKnownBindings ? 1 : 2],
- entries: [
- {
- binding: 0,
- resource: {
- buffer: bufferInternals.underlyingResource,
- size: bufferInternals.capacity,
- },
- },
- {
- binding: 1,
- resource: {
- buffer: bufferLeftOver.underlyingResource,
- size: bufferLeftOver.capacity,
- },
- },
- ],
- }));
- }
- renderPass2.setPipeline(pipeline);
- for (let i = 0; i < bindGroups.length; ++i) {
- renderPass2.setBindGroup(i, bindGroups[i]);
- }
- renderPass2.draw(4, 1, 0, 0);
- if (!renderPass) {
- bundle = renderPass2.finish();
- this._bundleCache[bundleKey] = bundle;
- }
- return bundle;
- }
- }
- //# sourceMappingURL=webgpuClearQuad.js.map
|