Browse Source

Set sampleCount at RTT creation time

Popov72 4 years ago
parent
commit
ae6939de5c

+ 2 - 0
src/Engines/depthTextureCreationOptions.ts

@@ -10,4 +10,6 @@ export class DepthTextureCreationOptions {
     comparisonFunction?: number;
     /** Specifies if the created texture is a cube texture */
     isCube?: boolean;
+    /** Specifies the sample count of the depth/stencil texture texture */
+    samples?: number;
 }

+ 2 - 2
src/Engines/thinEngine.ts

@@ -3336,7 +3336,7 @@ export class ThinEngine {
     }
 
     /** @hidden */
-    public _setupDepthStencilTexture(internalTexture: InternalTexture, size: number | { width: number, height: number, layers?: number }, generateStencil: boolean, bilinearFiltering: boolean, comparisonFunction: number): void {
+    public _setupDepthStencilTexture(internalTexture: InternalTexture, size: number | { width: number, height: number, layers?: number }, generateStencil: boolean, bilinearFiltering: boolean, comparisonFunction: number, samples = 1): void {
         const width = (<{ width: number, height: number, layers?: number }>size).width || <number>size;
         const height = (<{ width: number, height: number, layers?: number }>size).height || <number>size;
         const layers = (<{ width: number, height: number, layers?: number }>size).layers || 0;
@@ -3348,7 +3348,7 @@ export class ThinEngine {
         internalTexture.is2DArray = layers > 0;
         internalTexture.depth = layers;
         internalTexture.isReady = true;
-        internalTexture.samples = 1;
+        internalTexture.samples = samples;
         internalTexture.generateMipMaps = false;
         internalTexture._generateDepthBuffer = true;
         internalTexture._generateStencilBuffer = generateStencil;

+ 18 - 20
src/Engines/webgpuEngine.ts

@@ -435,7 +435,7 @@ export class WebGPUEngine extends Engine {
             instancedArrays: true,
             canUseTimestampForTimerQuery: false,
             blendMinMax: true,
-            maxMSAASamples: 1
+            maxMSAASamples: 8 // TODO WEBGPU what is the right value?
         };
 
         this._caps.parallelShaderCompile = null as any;
@@ -2124,6 +2124,7 @@ export class WebGPUEngine extends Engine {
             fullOptions.type = options.type === undefined ? Constants.TEXTURETYPE_UNSIGNED_INT : options.type;
             fullOptions.samplingMode = options.samplingMode === undefined ? Constants.TEXTURE_TRILINEAR_SAMPLINGMODE : options.samplingMode;
             fullOptions.format = options.format === undefined ? Constants.TEXTUREFORMAT_RGBA : options.format;
+            fullOptions.samples = options.samples ?? this._mainPassSampleCount;
         } else {
             fullOptions.generateMipMaps = <boolean>options;
             fullOptions.generateDepthBuffer = true;
@@ -2131,6 +2132,7 @@ export class WebGPUEngine extends Engine {
             fullOptions.type = Constants.TEXTURETYPE_UNSIGNED_INT;
             fullOptions.samplingMode = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE;
             fullOptions.format = Constants.TEXTUREFORMAT_RGBA;
+            fullOptions.samples = this._mainPassSampleCount;
         }
 
         const texture = new InternalTexture(this, InternalTextureSource.RenderTarget);
@@ -2147,7 +2149,7 @@ export class WebGPUEngine extends Engine {
         texture.height = height;
         texture.depth = layers;
         texture.isReady = true;
-        texture.samples = this._mainPassSampleCount;
+        texture.samples = fullOptions.samples;
         texture.generateMipMaps = fullOptions.generateMipMaps ? true : false;
         texture.samplingMode = fullOptions.samplingMode;
         texture.type = fullOptions.type;
@@ -2167,7 +2169,8 @@ export class WebGPUEngine extends Engine {
                     fullOptions.samplingMode === Constants.TEXTURE_NEAREST_LINEAR || fullOptions.samplingMode === Constants.TEXTURE_LINEAR_LINEAR_MIPNEAREST,
                 comparisonFunction: 0,
                 generateStencil: texture._generateStencilBuffer,
-                isCube: texture.isCube
+                isCube: texture.isCube,
+                samples: texture.samples,
             });
         }
 
@@ -2192,6 +2195,7 @@ export class WebGPUEngine extends Engine {
             type: Constants.TEXTURETYPE_UNSIGNED_INT,
             samplingMode: Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,
             format: Constants.TEXTUREFORMAT_RGBA,
+            samples: this._mainPassSampleCount,
             ...options
         };
         fullOptions.generateStencilBuffer = fullOptions.generateDepthBuffer && fullOptions.generateStencilBuffer;
@@ -2203,7 +2207,7 @@ export class WebGPUEngine extends Engine {
         texture.depth = 0;
         texture.isReady = true;
         texture.isCube = true;
-        texture.samples = 1;
+        texture.samples = fullOptions.samples;
         texture.generateMipMaps = fullOptions.generateMipMaps;
         texture.samplingMode = fullOptions.samplingMode;
         texture.type = fullOptions.type;
@@ -2223,7 +2227,8 @@ export class WebGPUEngine extends Engine {
                     fullOptions.samplingMode === Constants.TEXTURE_NEAREST_LINEAR || fullOptions.samplingMode === Constants.TEXTURE_LINEAR_LINEAR_MIPNEAREST,
                 comparisonFunction: 0,
                 generateStencil: texture._generateStencilBuffer,
-                isCube: texture.isCube
+                isCube: texture.isCube,
+                samples: texture.samples,
             });
         }
 
@@ -2241,7 +2246,7 @@ export class WebGPUEngine extends Engine {
     }
 
     /** @hidden */
-    public _setupDepthStencilTexture(internalTexture: InternalTexture, size: number | { width: number, height: number, layers?: number }, generateStencil: boolean, bilinearFiltering: boolean, comparisonFunction: number): void {
+    public _setupDepthStencilTexture(internalTexture: InternalTexture, size: number | { width: number, height: number, layers?: number }, generateStencil: boolean, bilinearFiltering: boolean, comparisonFunction: number, samples = 1): void {
         const width = (<{ width: number, height: number, layers?: number }>size).width || <number>size;
         const height = (<{ width: number, height: number, layers?: number }>size).height || <number>size;
         const layers = (<{ width: number, height: number, layers?: number }>size).layers || 0;
@@ -2253,7 +2258,7 @@ export class WebGPUEngine extends Engine {
         internalTexture.is2DArray = layers > 0;
         internalTexture.depth = layers;
         internalTexture.isReady = true;
-        internalTexture.samples = this._mainPassSampleCount;
+        internalTexture.samples = samples;
         internalTexture.generateMipMaps = false;
         internalTexture._generateDepthBuffer = true;
         internalTexture._generateStencilBuffer = generateStencil;
@@ -2270,12 +2275,13 @@ export class WebGPUEngine extends Engine {
             bilinearFiltering: false,
             comparisonFunction: 0,
             generateStencil: false,
+            samples: this._mainPassSampleCount,
             ...options
         };
 
         internalTexture.format = internalOptions.generateStencil ? Constants.TEXTUREFORMAT_DEPTH24_STENCIL8 : Constants.TEXTUREFORMAT_DEPTH32_FLOAT;
 
-        this._setupDepthStencilTexture(internalTexture, size, internalOptions.generateStencil, internalOptions.bilinearFiltering, internalOptions.comparisonFunction);
+        this._setupDepthStencilTexture(internalTexture, size, internalOptions.generateStencil, internalOptions.bilinearFiltering, internalOptions.comparisonFunction, internalOptions.samples);
 
         this._createGPUTextureForInternalTexture(internalTexture);
 
@@ -2292,12 +2298,13 @@ export class WebGPUEngine extends Engine {
             bilinearFiltering: false,
             comparisonFunction: 0,
             generateStencil: false,
+            samples: this._mainPassSampleCount,
             ...options
         };
 
         internalTexture.format = internalOptions.generateStencil ? Constants.TEXTUREFORMAT_DEPTH24_STENCIL8 : Constants.TEXTUREFORMAT_DEPTH32_FLOAT;
 
-        this._setupDepthStencilTexture(internalTexture, size, internalOptions.generateStencil, internalOptions.bilinearFiltering, internalOptions.comparisonFunction);
+        this._setupDepthStencilTexture(internalTexture, size, internalOptions.generateStencil, internalOptions.bilinearFiltering, internalOptions.comparisonFunction, internalOptions.samples);
 
         this._createGPUTextureForInternalTexture(internalTexture);
 
@@ -2305,18 +2312,9 @@ export class WebGPUEngine extends Engine {
     }
 
     public updateRenderTargetTextureSampleCount(texture: Nullable<InternalTexture>, samples: number): number {
-        if (!texture) {
-            return 1;
-        }
-
-        if (texture.samples === samples) {
-            return samples;
-        }
-
-        // TODO WEBGPU handle sampleCount
-        //console.warn("updateRenderTargetTextureSampleCount not implemented yet in WebGPU");
+        // samples is used at creation time in WebGPU, you can't change it afterwards
 
-        return 1;
+        return samples;
     }
 
     //------------------------------------------------------------------------------

+ 2 - 1
src/Materials/Textures/internalTexture.ts

@@ -406,7 +406,8 @@ export class InternalTexture {
                     bilinearFiltering: this.samplingMode !== Constants.TEXTURE_BILINEAR_SAMPLINGMODE,
                     comparisonFunction: this._comparisonFunction,
                     generateStencil: this._generateStencilBuffer,
-                    isCube: this.isCube
+                    isCube: this.isCube,
+                    samples: this.samples
                 };
 
                 let size = {

+ 20 - 5
src/Materials/Textures/renderTargetTexture.ts

@@ -299,8 +299,9 @@ export class RenderTargetTexture extends Texture {
      * @param isMulti True if multiple textures need to be created (Draw Buffers)
      * @param format The internal format of the buffer in the RTT (RED, RG, RGB, RGBA, ALPHA...)
      * @param delayAllocation if the texture allocation should be delayed (default: false)
+     * @param samples sample count to use when creating the RTT
      */
-    constructor(name: string, size: number | { width: number, height: number, layers?: number } | { ratio: number }, scene: Nullable<Scene>, generateMipMaps?: boolean, doNotChangeAspectRatio: boolean = true, type: number = Constants.TEXTURETYPE_UNSIGNED_INT, isCube = false, samplingMode = Texture.TRILINEAR_SAMPLINGMODE, generateDepthBuffer = true, generateStencilBuffer = false, isMulti = false, format = Constants.TEXTUREFORMAT_RGBA, delayAllocation = false) {
+    constructor(name: string, size: number | { width: number, height: number, layers?: number } | { ratio: number }, scene: Nullable<Scene>, generateMipMaps?: boolean, doNotChangeAspectRatio: boolean = true, type: number = Constants.TEXTURETYPE_UNSIGNED_INT, isCube = false, samplingMode = Texture.TRILINEAR_SAMPLINGMODE, generateDepthBuffer = true, generateStencilBuffer = false, isMulti = false, format = Constants.TEXTUREFORMAT_RGBA, delayAllocation = false, samples?: number) {
         super(null, scene, !generateMipMaps);
         scene = this.getScene();
         if (!scene) {
@@ -335,7 +336,8 @@ export class RenderTargetTexture extends Texture {
             format: format,
             samplingMode: samplingMode,
             generateDepthBuffer: generateDepthBuffer,
-            generateStencilBuffer: generateStencilBuffer
+            generateStencilBuffer: generateStencilBuffer,
+            samples: samples,
         };
 
         if (samplingMode === Texture.NEAREST_SAMPLINGMODE) {
@@ -351,6 +353,9 @@ export class RenderTargetTexture extends Texture {
             } else {
                 this._texture = scene.getEngine().createRenderTargetTexture(this._size, this._renderTargetOptions);
             }
+            if (samples !== undefined) {
+                this.samples = samples;
+            }
         }
     }
 
@@ -360,8 +365,9 @@ export class RenderTargetTexture extends Texture {
      * @param comparisonFunction Specifies the comparison function to set on the texture. If 0 or undefined, the texture is not in comparison mode
      * @param bilinearFiltering Specifies whether or not bilinear filtering is enable on the texture
      * @param generateStencil Specifies whether or not a stencil should be allocated in the texture
+     * @param samples sample count of the depth/stencil texture
      */
-    public createDepthStencilTexture(comparisonFunction: number = 0, bilinearFiltering: boolean = true, generateStencil: boolean = false): void {
+    public createDepthStencilTexture(comparisonFunction: number = 0, bilinearFiltering: boolean = true, generateStencil: boolean = false, samples: number = 1): void {
         const internalTexture = this.getInternalTexture();
         if (!this.getScene() || !internalTexture) {
             return;
@@ -374,7 +380,8 @@ export class RenderTargetTexture extends Texture {
             bilinearFiltering,
             comparisonFunction,
             generateStencil,
-            isCube: this.isCube
+            isCube: this.isCube,
+            samples
         });
     }
 
@@ -608,6 +615,10 @@ export class RenderTargetTexture extends Texture {
             this._texture = scene.getEngine().createRenderTargetTexture(this._size, this._renderTargetOptions);
         }
 
+        if (this._renderTargetOptions.samples !== undefined) {
+            this.samples = this._renderTargetOptions.samples;
+        }
+
         if (this.onResizeObservable.hasObservers()) {
             this.onResizeObservable.notifyObservers(this);
         }
@@ -986,7 +997,11 @@ export class RenderTargetTexture extends Texture {
             this.isCube,
             this._renderTargetOptions.samplingMode,
             this._renderTargetOptions.generateDepthBuffer,
-            this._renderTargetOptions.generateStencilBuffer
+            this._renderTargetOptions.generateStencilBuffer,
+            undefined,
+            this._renderTargetOptions.format,
+            undefined,
+            this._renderTargetOptions.samples
         );
 
         // Base texture