Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/browser/viewParts/gpuMark/gpuMark.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import * as viewEvents from '../../../common/viewEvents.js';
7
import { ViewContext } from '../../../common/viewModel/viewContext.js';
8
import { ViewGpuContext } from '../../gpu/viewGpuContext.js';
9
import { DynamicViewOverlay } from '../../view/dynamicViewOverlay.js';
10
import { RenderingContext } from '../../view/renderingContext.js';
11
import { ViewLineOptions } from '../viewLines/viewLineOptions.js';
12
import './gpuMark.css';
13
14
/**
15
* A mark on lines to make identification of GPU-rendered lines vs DOM easier.
16
*/
17
export class GpuMarkOverlay extends DynamicViewOverlay {
18
19
public static readonly CLASS_NAME = 'gpu-mark';
20
21
private readonly _context: ViewContext;
22
23
private _renderResult: string[] | null;
24
25
constructor(context: ViewContext, private readonly _viewGpuContext: ViewGpuContext) {
26
super();
27
this._context = context;
28
this._renderResult = null;
29
this._context.addEventHandler(this);
30
}
31
32
public override dispose(): void {
33
this._context.removeEventHandler(this);
34
this._renderResult = null;
35
super.dispose();
36
}
37
38
// --- begin event handlers
39
40
public override onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean {
41
return true;
42
}
43
public override onCursorStateChanged(e: viewEvents.ViewCursorStateChangedEvent): boolean {
44
return true;
45
}
46
public override onFlushed(e: viewEvents.ViewFlushedEvent): boolean {
47
return true;
48
}
49
public override onLinesChanged(e: viewEvents.ViewLinesChangedEvent): boolean {
50
return true;
51
}
52
public override onLinesDeleted(e: viewEvents.ViewLinesDeletedEvent): boolean {
53
return true;
54
}
55
public override onLinesInserted(e: viewEvents.ViewLinesInsertedEvent): boolean {
56
return true;
57
}
58
public override onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean {
59
return e.scrollTopChanged;
60
}
61
public override onZonesChanged(e: viewEvents.ViewZonesChangedEvent): boolean {
62
return true;
63
}
64
public override onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean {
65
return true;
66
}
67
68
// --- end event handlers
69
70
public prepareRender(ctx: RenderingContext): void {
71
const visibleStartLineNumber = ctx.visibleRange.startLineNumber;
72
const visibleEndLineNumber = ctx.visibleRange.endLineNumber;
73
74
const viewportData = ctx.viewportData;
75
const options = new ViewLineOptions(this._context.configuration, this._context.theme.type);
76
77
const output: string[] = [];
78
for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) {
79
const lineIndex = lineNumber - visibleStartLineNumber;
80
const cannotRenderReasons = this._viewGpuContext.canRenderDetailed(options, viewportData, lineNumber);
81
output[lineIndex] = cannotRenderReasons.length ? `<div class="${GpuMarkOverlay.CLASS_NAME}" title="Cannot render on GPU: ${cannotRenderReasons.join(', ')}"></div>` : '';
82
}
83
84
this._renderResult = output;
85
}
86
87
public render(startLineNumber: number, lineNumber: number): string {
88
if (!this._renderResult) {
89
return '';
90
}
91
const lineIndex = lineNumber - startLineNumber;
92
if (lineIndex < 0 || lineIndex >= this._renderResult.length) {
93
return '';
94
}
95
return this._renderResult[lineIndex];
96
}
97
}
98
99