updateMultisampleRenderTarget method

void updateMultisampleRenderTarget(
  1. RenderTarget renderTarget
)

Implementation

void updateMultisampleRenderTarget(RenderTarget renderTarget) {
		if ( renderTarget.samples > 0 ) {
			if ( !useMultisampledRTT( renderTarget )) {
				final textures = renderTarget.textures;
				final width = renderTarget.width;
				final height = renderTarget.height;
				int mask = WebGL.COLOR_BUFFER_BIT;
				final depthStyle = renderTarget.stencilBuffer ? WebGL.DEPTH_STENCIL_ATTACHMENT : WebGL.DEPTH_ATTACHMENT;
				final renderTargetProperties = properties.get( renderTarget );
				final isMultipleRenderTargets = ( textures.length > 1 );

				// If MRT we need to remove FBO attachments
				if ( isMultipleRenderTargets ) {
					for (int i = 0; i < textures.length; i ++ ) {
						state.bindFramebuffer( WebGL.FRAMEBUFFER, renderTargetProperties['__webglMultisampledFramebuffer'] );
						_gl.framebufferRenderbuffer( WebGL.FRAMEBUFFER, WebGL.COLOR_ATTACHMENT0 + i, WebGL.RENDERBUFFER, null );

						state.bindFramebuffer( WebGL.FRAMEBUFFER, renderTargetProperties['__webglFramebuffer'] );
						_gl.framebufferTexture2D( WebGL.DRAW_FRAMEBUFFER, WebGL.COLOR_ATTACHMENT0 + i, WebGL.TEXTURE_2D, null, 0 );
					}
				}

				state.bindFramebuffer( WebGL.READ_FRAMEBUFFER, renderTargetProperties['__webglMultisampledFramebuffer'] );
				state.bindFramebuffer( WebGL.DRAW_FRAMEBUFFER, renderTargetProperties['__webglFramebuffer'] );

				for (int i = 0; i < textures.length; i ++ ) {
					if ( renderTarget.resolveDepthBuffer ) {
						if ( renderTarget.depthBuffer ) mask |= WebGL.DEPTH_BUFFER_BIT;
						if ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= WebGL.STENCIL_BUFFER_BIT;
					}

					if ( isMultipleRenderTargets ) {
						_gl.framebufferRenderbuffer( WebGL.READ_FRAMEBUFFER, WebGL.COLOR_ATTACHMENT0, WebGL.RENDERBUFFER, renderTargetProperties['__webglColorRenderbuffer'][ i ] );

						final webglTexture = properties.get( textures[ i ] )['__webglTexture'];
						_gl.framebufferTexture2D( WebGL.DRAW_FRAMEBUFFER, WebGL.COLOR_ATTACHMENT0, WebGL.TEXTURE_2D, webglTexture, 0 );
					}

					_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, WebGL.NEAREST );

					if ( supportsInvalidateFramebuffer) {
						invalidationArrayRead.length = 0;
						invalidationArrayDraw.length = 0;

						invalidationArrayRead.add( WebGL.COLOR_ATTACHMENT0 + i );

						if ( renderTarget.depthBuffer && !renderTarget.resolveDepthBuffer) {
							invalidationArrayRead.add( depthStyle );
							invalidationArrayDraw.add( depthStyle );

							_gl.invalidateFramebuffer( WebGL.DRAW_FRAMEBUFFER, invalidationArrayDraw );
						}

						_gl.invalidateFramebuffer( WebGL.READ_FRAMEBUFFER, invalidationArrayRead );
					}
				}

				state.bindFramebuffer( WebGL.READ_FRAMEBUFFER, null );
				state.bindFramebuffer( WebGL.DRAW_FRAMEBUFFER, null );

				// If MRT since pre-blit we removed the FBO we need to reconstruct the attachments
				if ( isMultipleRenderTargets ) {
					for (int i = 0; i < textures.length; i ++ ) {
						state.bindFramebuffer( WebGL.FRAMEBUFFER, renderTargetProperties['__webglMultisampledFramebuffer'] );
						_gl.framebufferRenderbuffer( WebGL.FRAMEBUFFER, WebGL.COLOR_ATTACHMENT0 + i, WebGL.RENDERBUFFER, renderTargetProperties['__webglColorRenderbuffer'][ i ] );

						final webglTexture = properties.get( textures[ i ] )['__webglTexture'];

						state.bindFramebuffer( WebGL.FRAMEBUFFER, renderTargetProperties['__webglFramebuffer'] );
						_gl.framebufferTexture2D( WebGL.DRAW_FRAMEBUFFER, WebGL.COLOR_ATTACHMENT0 + i, WebGL.TEXTURE_2D, webglTexture, 0 );
					}
				}

				state.bindFramebuffer( WebGL.DRAW_FRAMEBUFFER, renderTargetProperties['__webglMultisampledFramebuffer'] );
			} else {
				if ( renderTarget.depthBuffer && !renderTarget.resolveDepthBuffer && supportsInvalidateFramebuffer ) {
					final depthStyle = renderTarget.stencilBuffer ? WebGL.DEPTH_STENCIL_ATTACHMENT : WebGL.DEPTH_ATTACHMENT;
					_gl.invalidateFramebuffer( WebGL.DRAW_FRAMEBUFFER, [ depthStyle ] );
				}
			}
		}
}