Path: blob/main/src/vs/editor/browser/viewParts/gpuMark/gpuMark.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import * as viewEvents from '../../../common/viewEvents.js';6import { ViewContext } from '../../../common/viewModel/viewContext.js';7import { ViewGpuContext } from '../../gpu/viewGpuContext.js';8import { DynamicViewOverlay } from '../../view/dynamicViewOverlay.js';9import { RenderingContext } from '../../view/renderingContext.js';10import { ViewLineOptions } from '../viewLines/viewLineOptions.js';11import './gpuMark.css';1213/**14* A mark on lines to make identification of GPU-rendered lines vs DOM easier.15*/16export class GpuMarkOverlay extends DynamicViewOverlay {1718public static readonly CLASS_NAME = 'gpu-mark';1920private readonly _context: ViewContext;2122private _renderResult: string[] | null;2324constructor(context: ViewContext, private readonly _viewGpuContext: ViewGpuContext) {25super();26this._context = context;27this._renderResult = null;28this._context.addEventHandler(this);29}3031public override dispose(): void {32this._context.removeEventHandler(this);33this._renderResult = null;34super.dispose();35}3637// --- begin event handlers3839public override onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean {40return true;41}42public override onCursorStateChanged(e: viewEvents.ViewCursorStateChangedEvent): boolean {43return true;44}45public override onFlushed(e: viewEvents.ViewFlushedEvent): boolean {46return true;47}48public override onLinesChanged(e: viewEvents.ViewLinesChangedEvent): boolean {49return true;50}51public override onLinesDeleted(e: viewEvents.ViewLinesDeletedEvent): boolean {52return true;53}54public override onLinesInserted(e: viewEvents.ViewLinesInsertedEvent): boolean {55return true;56}57public override onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean {58return e.scrollTopChanged;59}60public override onZonesChanged(e: viewEvents.ViewZonesChangedEvent): boolean {61return true;62}63public override onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean {64return true;65}6667// --- end event handlers6869public prepareRender(ctx: RenderingContext): void {70const visibleStartLineNumber = ctx.visibleRange.startLineNumber;71const visibleEndLineNumber = ctx.visibleRange.endLineNumber;7273const viewportData = ctx.viewportData;74const options = new ViewLineOptions(this._context.configuration, this._context.theme.type);7576const output: string[] = [];77for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) {78const lineIndex = lineNumber - visibleStartLineNumber;79const cannotRenderReasons = this._viewGpuContext.canRenderDetailed(options, viewportData, lineNumber);80output[lineIndex] = cannotRenderReasons.length ? `<div class="${GpuMarkOverlay.CLASS_NAME}" title="Cannot render on GPU: ${cannotRenderReasons.join(', ')}"></div>` : '';81}8283this._renderResult = output;84}8586public render(startLineNumber: number, lineNumber: number): string {87if (!this._renderResult) {88return '';89}90const lineIndex = lineNumber - startLineNumber;91if (lineIndex < 0 || lineIndex >= this._renderResult.length) {92return '';93}94return this._renderResult[lineIndex];95}96}979899