128 lines
8.3 KiB
JavaScript
128 lines
8.3 KiB
JavaScript
shadow$provide.module$node_modules$pixi_DOT_js$lib$rendering$renderers$gpu$renderTarget$GpuRenderTargetAdaptor = function(global, require, module, exports) {
|
|
var _const = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$const"), CanvasSource = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$texture$sources$CanvasSource"), TextureSource = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$texture$sources$TextureSource"), GpuRenderTarget = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gpu$renderTarget$GpuRenderTarget");
|
|
"use strict";
|
|
class GpuRenderTargetAdaptor {
|
|
init(renderer, renderTargetSystem) {
|
|
this._renderer = renderer;
|
|
this._renderTargetSystem = renderTargetSystem;
|
|
}
|
|
copyToTexture(sourceRenderSurfaceTexture, destinationTexture, originSrc, size, originDest) {
|
|
const renderer = this._renderer;
|
|
sourceRenderSurfaceTexture = this._getGpuColorTexture(sourceRenderSurfaceTexture);
|
|
const backGpuTexture = renderer.texture.getGpuSource(destinationTexture.source);
|
|
renderer.encoder.commandEncoder.copyTextureToTexture({texture:sourceRenderSurfaceTexture, origin:originSrc}, {texture:backGpuTexture, origin:originDest}, size);
|
|
return destinationTexture;
|
|
}
|
|
startRenderPass(renderTarget, clear = !0, clearColor, viewport, mipLevel = 0, layer = 0) {
|
|
const gpuRenderTarget = this._renderTargetSystem.getGpuRenderTarget(renderTarget);
|
|
if (0 !== layer && gpuRenderTarget.msaaTextures?.length) {
|
|
throw Error("[RenderTargetSystem] Rendering to array layers is not supported with MSAA render targets.");
|
|
}
|
|
if (0 < mipLevel && gpuRenderTarget.msaaTextures?.length) {
|
|
throw Error("[RenderTargetSystem] Rendering to mip levels is not supported with MSAA render targets.");
|
|
}
|
|
renderTarget = this.getDescriptor(renderTarget, clear, clearColor, mipLevel, layer);
|
|
gpuRenderTarget.descriptor = renderTarget;
|
|
this._renderer.pipeline.setRenderTarget(gpuRenderTarget);
|
|
this._renderer.encoder.beginRenderPass(gpuRenderTarget);
|
|
this._renderer.encoder.setViewport(viewport);
|
|
}
|
|
finishRenderPass() {
|
|
this._renderer.encoder.endRenderPass();
|
|
}
|
|
_getGpuColorTexture(renderTarget) {
|
|
const gpuRenderTarget = this._renderTargetSystem.getGpuRenderTarget(renderTarget);
|
|
return gpuRenderTarget.contexts[0] ? gpuRenderTarget.contexts[0].getCurrentTexture() : this._renderer.texture.getGpuSource(renderTarget.colorTextures[0].source);
|
|
}
|
|
getDescriptor(renderTarget, clear, clearValue, mipLevel = 0, layer = 0) {
|
|
"boolean" === typeof clear && (clear = clear ? _const.CLEAR.ALL : _const.CLEAR.NONE);
|
|
const renderTargetSystem = this._renderTargetSystem, gpuRenderTarget = renderTargetSystem.getGpuRenderTarget(renderTarget), colorAttachments = renderTarget.colorTextures.map((texture, i) => {
|
|
var context = gpuRenderTarget.contexts[i];
|
|
let resolveTarget;
|
|
if (context) {
|
|
if (0 !== layer) {
|
|
throw Error("[RenderTargetSystem] Rendering to array layers is not supported for canvas targets.");
|
|
}
|
|
texture = context.getCurrentTexture().createView();
|
|
} else {
|
|
texture = this._renderer.texture.getGpuSource(texture).createView({dimension:"2d", baseMipLevel:mipLevel, mipLevelCount:1, baseArrayLayer:layer, arrayLayerCount:1});
|
|
}
|
|
context = !1;
|
|
gpuRenderTarget.msaaTextures[i] && (resolveTarget = texture, texture = this._renderer.texture.getTextureView(gpuRenderTarget.msaaTextures[i]), context = gpuRenderTarget.msaaTextures[i].transient);
|
|
i = clear & _const.CLEAR.COLOR ? "clear" : "load";
|
|
clearValue ?? (clearValue = renderTargetSystem.defaultClearColor);
|
|
return {view:texture, resolveTarget, clearValue, storeOp:context ? "discard" : "store", loadOp:i};
|
|
});
|
|
!renderTarget.stencil && !renderTarget.depth || renderTarget.depthStencilTexture || (renderTarget.ensureDepthStencilTexture(), renderTarget.depthStencilTexture.source.sampleCount = gpuRenderTarget.msaa ? 4 : 1, renderTarget.depthStencilTexture.source.transient = !!gpuRenderTarget.msaaTextures[0]?.transient);
|
|
if (renderTarget.depthStencilTexture) {
|
|
var depthStencilAttachment = clear & _const.CLEAR.STENCIL ? "clear" : "load";
|
|
const depthLoadOp = clear & _const.CLEAR.DEPTH ? "clear" : "load", dsStoreOp = renderTarget.depthStencilTexture.source.transient ? "discard" : "store";
|
|
depthStencilAttachment = {view:this._renderer.texture.getGpuSource(renderTarget.depthStencilTexture.source).createView({dimension:"2d", baseMipLevel:mipLevel, mipLevelCount:1, baseArrayLayer:layer, arrayLayerCount:1}), stencilStoreOp:dsStoreOp, stencilLoadOp:depthStencilAttachment, depthClearValue:1, depthLoadOp, depthStoreOp:dsStoreOp};
|
|
}
|
|
return {colorAttachments, depthStencilAttachment};
|
|
}
|
|
clear(renderTarget, clear = !0, clearColor, viewport, mipLevel = 0, layer = 0) {
|
|
if (clear) {
|
|
var {gpu, encoder} = this._renderer, device = gpu.device;
|
|
if (null === encoder.commandEncoder) {
|
|
const commandEncoder = device.createCommandEncoder();
|
|
renderTarget = this.getDescriptor(renderTarget, clear, clearColor, mipLevel, layer);
|
|
renderTarget = commandEncoder.beginRenderPass(renderTarget);
|
|
renderTarget.setViewport(viewport.x, viewport.y, viewport.width, viewport.height, 0, 1);
|
|
renderTarget.end();
|
|
viewport = commandEncoder.finish();
|
|
device.queue.submit([viewport]);
|
|
} else {
|
|
this.startRenderPass(renderTarget, clear, clearColor, viewport, mipLevel, layer);
|
|
}
|
|
}
|
|
}
|
|
initGpuRenderTarget(renderTarget) {
|
|
renderTarget.isRoot = !0;
|
|
const gpuRenderTarget = new GpuRenderTarget.GpuRenderTarget();
|
|
gpuRenderTarget.colorTargetCount = renderTarget.colorTextures.length;
|
|
renderTarget.colorTextures.forEach((colorTexture, i) => {
|
|
if (colorTexture instanceof CanvasSource.CanvasSource) {
|
|
const context = colorTexture.resource.getContext("webgpu"), alphaMode = colorTexture.transparent ? "premultiplied" : "opaque";
|
|
try {
|
|
context.configure({device:this._renderer.gpu.device, usage:GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, format:"bgra8unorm", alphaMode});
|
|
} catch (e) {
|
|
console.error(e);
|
|
}
|
|
gpuRenderTarget.contexts[i] = context;
|
|
}
|
|
if (gpuRenderTarget.msaa = colorTexture.source.antialias) {
|
|
colorTexture = new TextureSource.TextureSource({width:0, height:0, sampleCount:4, transient:colorTexture.source.transient, arrayLayerCount:colorTexture.source.arrayLayerCount}), gpuRenderTarget.msaaTextures[i] = colorTexture;
|
|
}
|
|
});
|
|
gpuRenderTarget.msaa && (gpuRenderTarget.msaaSamples = 4, renderTarget.depthStencilTexture && (renderTarget.depthStencilTexture.source.sampleCount = 4, renderTarget.depthStencilTexture.source.transient = !!gpuRenderTarget.msaaTextures[0]?.transient));
|
|
return gpuRenderTarget;
|
|
}
|
|
destroyGpuRenderTarget(gpuRenderTarget) {
|
|
gpuRenderTarget.contexts.forEach(context => {
|
|
context.unconfigure();
|
|
});
|
|
gpuRenderTarget.msaaTextures.forEach(texture => {
|
|
texture.destroy();
|
|
});
|
|
gpuRenderTarget.msaaTextures.length = 0;
|
|
gpuRenderTarget.contexts.length = 0;
|
|
}
|
|
ensureDepthStencilTexture(renderTarget) {
|
|
const gpuRenderTarget = this._renderTargetSystem.getGpuRenderTarget(renderTarget);
|
|
renderTarget.depthStencilTexture && gpuRenderTarget.msaa && (renderTarget.depthStencilTexture.source.sampleCount = 4);
|
|
}
|
|
resizeGpuRenderTarget(renderTarget) {
|
|
const gpuRenderTarget = this._renderTargetSystem.getGpuRenderTarget(renderTarget);
|
|
gpuRenderTarget.width = renderTarget.width;
|
|
gpuRenderTarget.height = renderTarget.height;
|
|
gpuRenderTarget.msaa && renderTarget.colorTextures.forEach((colorTexture, i) => {
|
|
gpuRenderTarget.msaaTextures[i]?.resize(colorTexture.source.width, colorTexture.source.height, colorTexture.source._resolution);
|
|
});
|
|
}
|
|
}
|
|
exports.GpuRenderTargetAdaptor = GpuRenderTargetAdaptor;
|
|
};
|
|
|
|
//# sourceMappingURL=module$node_modules$pixi_DOT_js$lib$rendering$renderers$gpu$renderTarget$GpuRenderTargetAdaptor.js.map
|