Skip to content

Commit 403fe4e

Browse files
authored
Merge pull request #332 from FaberVitale/feat/devtools-display-cart-size
[feat][devtools] show cartridge size
2 parents 8a6eb37 + e69641a commit 403fe4e

10 files changed

Lines changed: 86 additions & 26 deletions

File tree

devtools/web/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
},
2929
fps: 60,
3030
storedValue: null,
31+
wasmBufferByteLen: 0xffffff,
3132
};
3233
window.dispatchEvent(
3334
new CustomEvent(updateCompletedEventType, {

devtools/web/src/components/devtools/devtools.scss

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,19 @@ $devtools-body-max-height: calc(
136136
}
137137
}
138138

139+
.cart-size-wrapper {
140+
display: grid;
141+
grid-auto-flow: row;
142+
justify-content: flex-start;
143+
align-items: flex-start;
144+
grid-gap: 0.25em;
145+
146+
.size-box {
147+
display: flex;
148+
justify-content: space-between;
149+
}
150+
}
151+
139152
.flags-wrapper {
140153
display: grid;
141154
grid-template-rows: 1fr 1fr;

devtools/web/src/components/devtools/devtools.ts

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
11
import { html, LitElement } from 'lit';
22
import { customElement, state } from 'lit/decorators.js';
3-
import { UpdateController } from '../../controllers/UpdateController';
3+
import {
4+
UpdateController,
5+
UpdateControllerState,
6+
} from '../../controllers/UpdateController';
47
import { createCloseDevtoolsEvent } from '../../events/close-devtools';
58
import devtoolsCss from './devtools.scss';
69
import { withTheme } from '../../styles/commons';
710
import {
11+
MAX_CART_SIZE,
812
SYSTEM_HIDE_GAMEPAD_OVERLAY,
913
SYSTEM_PRESERVE_FRAMEBUFFER,
1014
} from '../../constants';
1115
import { classMap } from 'lit/directives/class-map.js';
1216
import { repeat } from 'lit/directives/repeat.js';
1317
import { bitmask, identity } from '../../utils/functions';
14-
import { MemoryView } from '../../models/MemoryView';
1518

1619
export const wasm4DevtoolsTagName = 'wasm4-devtools' as const;
1720

1821
const tabs = ['general', 'controls', 'mem', 'info'] as const;
1922

23+
const colorMasks = [bitmask(3), bitmask(7, 3), bitmask(11, 7), bitmask(15, 11)];
24+
2025
/**
2126
* ### Programmatic usage
2227
* @example
@@ -62,14 +67,12 @@ export class Wasm4Devtools extends LitElement {
6267
this._fixedPosition = this._fixedPosition === 'left' ? 'right' : 'left';
6368
};
6469

65-
private _renderGeneralView = (memoryView: MemoryView, fps: number) => {
70+
private _renderGeneralView = ({
71+
memoryView,
72+
fps,
73+
wasmBufferByteLen,
74+
}: UpdateControllerState) => {
6675
const drawColors = memoryView.drawColors ?? 0;
67-
const colorMasks = [
68-
bitmask(3),
69-
bitmask(7, 3),
70-
bitmask(11, 7),
71-
bitmask(15, 11),
72-
];
7376

7477
return html`<article>
7578
<wasm4-palette
@@ -107,6 +110,16 @@ export class Wasm4Devtools extends LitElement {
107110
<h4>fps</h4>
108111
<span class="info-box text-primary">${fps}</span>
109112
</section>
113+
<section class="cart-size-wrapper">
114+
<h4>cartridge size ${wasmBufferByteLen > MAX_CART_SIZE ? `⚠️` : ''}</h4>
115+
<div class="size-box">
116+
current
117+
<span class="info-box text-primary">${wasmBufferByteLen}B</span>
118+
</div>
119+
<div class="size-box">
120+
limit <span class="info-box text-primary">${MAX_CART_SIZE}B</span>
121+
</div>
122+
</section>
110123
<section class="flags-section">
111124
<h4>system flags</h4>
112125
<div class="flags-wrapper">
@@ -131,7 +144,7 @@ export class Wasm4Devtools extends LitElement {
131144
return html` <wasm4-info-view></wasm4-info-view> `;
132145
};
133146

134-
private _renderControls = (memoryView: MemoryView, _: number) => {
147+
private _renderControls = ({ memoryView }: UpdateControllerState) => {
135148
return html`<wasm4-controls-view
136149
.mouseButtons=${memoryView.mouseBtnByte}
137150
.mouseX=${memoryView.pointerPos.x}
@@ -140,13 +153,13 @@ export class Wasm4Devtools extends LitElement {
140153
></wasm4-controls-view>`;
141154
};
142155

143-
private _renderMemory = (memoryView: MemoryView, _: number) => {
156+
private _renderMemory = ({ memoryView }: UpdateControllerState) => {
144157
return html`<wasm4-memory-view
145158
.memoryView=${memoryView}
146159
></wasm4-memory-view>`;
147160
};
148161

149-
private _renderTab = (memoryView: MemoryView, fps: number) => {
162+
private _renderTab = (updateControllerState: UpdateControllerState) => {
150163
let renderTab;
151164
switch (this._activeTab) {
152165
case 'controls':
@@ -162,16 +175,14 @@ export class Wasm4Devtools extends LitElement {
162175
renderTab = this._renderGeneralView;
163176
}
164177

165-
return renderTab.call(this, memoryView, fps);
178+
return renderTab.call(this, updateControllerState);
166179
};
167180

168181
render() {
169182
if (!this.updateController.state) {
170183
return null;
171184
}
172185

173-
const { memoryView, fps } = this.updateController.state;
174-
175186
const fixedPosBtnLabel = `move ${
176187
this._fixedPosition === 'left' ? 'right' : 'left'
177188
}`;
@@ -260,7 +271,7 @@ export class Wasm4Devtools extends LitElement {
260271
</li>`
261272
)}
262273
</ul>
263-
${this._renderTab(memoryView, fps)}
274+
${this._renderTab(this.updateController.state)}
264275
</div>
265276
</div>
266277
</div>`;

devtools/web/src/constants.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ export const MOUSE_MIDDLE = 4;
3535
export const SYSTEM_PRESERVE_FRAMEBUFFER = 1;
3636
export const SYSTEM_HIDE_GAMEPAD_OVERLAY = 2;
3737

38+
export const MAX_CART_SIZE = 0xffff;
39+
3840
interface Range {
3941
offset: number;
4042
len: number;

devtools/web/src/controllers/UpdateController.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ import {
55
} from '../events/update-completed';
66
import { MemoryView } from '../models/MemoryView';
77

8-
interface UpdateControllerState {
8+
export interface UpdateControllerState {
99
memoryView: MemoryView;
1010
storedValue: string | null;
1111
fps: number;
12+
wasmBufferByteLen: number;
1213
}
1314

1415
/**
@@ -30,6 +31,7 @@ export class UpdateController implements ReactiveController {
3031
memoryView: detail.memory,
3132
storedValue: detail.storedValue ?? null,
3233
fps: detail.fps,
34+
wasmBufferByteLen: detail.wasmBufferByteLen,
3335
};
3436

3537
this.state = nextState;

devtools/web/src/devtools-manager.ts

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ class BufferedRuntimeData implements BufferedData {
4242
};
4343
}
4444

45+
interface RuntimeInfo {
46+
data: DataView;
47+
wasmBufferByteLen: number;
48+
}
49+
4550
export class DevtoolsManager {
4651
/**
4752
* @private
@@ -56,11 +61,18 @@ export class DevtoolsManager {
5661
/**
5762
* Notifies the devtools that the web runtime has completed an update.
5863
*/
59-
updateCompleted = (dataView: DataView, deltaFrame: number) => {
64+
updateCompleted = <Info extends RuntimeInfo>(
65+
runtimeInfo: Info,
66+
deltaFrame: number
67+
) => {
6068
if (this._enabled) {
6169
const fps = Math.floor(1_000 / deltaFrame);
62-
this._bufferedData.update(dataView);
63-
this._notifyUpdateCompleted(dataView, fps);
70+
this._bufferedData.update(runtimeInfo.data);
71+
this._notifyUpdateCompleted(
72+
runtimeInfo.data,
73+
runtimeInfo.wasmBufferByteLen,
74+
fps
75+
);
6476
}
6577
};
6678

@@ -87,9 +99,14 @@ export class DevtoolsManager {
8799
};
88100

89101
private _notifyUpdateCompleted = throttle(
90-
(dataView: DataView, fps: number) => {
102+
(dataView: DataView, wasmBufferByteLen: number, fps: number) => {
91103
window.dispatchEvent(
92-
createUpdateCompletedEvent(dataView, fps, this._bufferedData.flush())
104+
createUpdateCompletedEvent({
105+
dataView,
106+
wasmBufferByteLen,
107+
fps,
108+
bufferedData: this._bufferedData.flush(),
109+
})
93110
);
94111
},
95112
200

devtools/web/src/events/update-completed.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export const updateCompletedEventType = 'wasm4-update-completed';
55
export interface UpdateCompletedDetails {
66
memory: MemoryView;
77
fps: number;
8+
wasmBufferByteLen: number;
89
storedValue: string | null;
910
}
1011

@@ -24,6 +25,13 @@ function getStoredValue(): string | null {
2425
}
2526
}
2627

28+
export interface UpdateCompletedData {
29+
dataView: DataView;
30+
fps: number;
31+
bufferedData: BufferedMemoryData;
32+
wasmBufferByteLen: number;
33+
}
34+
2735
/**
2836
* An event that is meant to be triggered after a `runtime.update` that provides
2937
* infos regarding the console runtime.
@@ -34,16 +42,15 @@ function getStoredValue(): string | null {
3442
* @returns
3543
*/
3644
export function createUpdateCompletedEvent(
37-
dataView: DataView,
38-
fps: number,
39-
bufferedData: BufferedMemoryData,
45+
{ dataView, fps, bufferedData, wasmBufferByteLen }: UpdateCompletedData,
4046
eventInit: EventInit = { bubbles: true }
4147
): Wasm4UpdateCompletedEvent {
4248
return new CustomEvent(updateCompletedEventType, {
4349
...eventInit,
4450
detail: {
4551
memory: new MemoryView(dataView, bufferedData),
4652
fps,
53+
wasmBufferByteLen,
4754
storedValue: getStoredValue(),
4855
},
4956
});

devtools/web/src/styles/theme.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ $theme: (
6565
opacity: 0.4;
6666
}
6767

68+
.display-block {
69+
display: block !important;
70+
}
71+
6872
.info-box {
6973
text-align: center;
7074
padding: 0.2em 0.4em;

runtimes/web/src/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,7 @@ async function loadCartWasm () {
498498
? "none" : "";
499499

500500
if (DEVELOPER_BUILD) {
501-
devtoolsManager.updateCompleted(runtime.data, deltaTime);
501+
devtoolsManager.updateCompleted(runtime, deltaTime);
502502
}
503503
}
504504

runtimes/web/src/runtime.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export class Runtime {
2929
this.reset();
3030

3131
this.pauseState = 0;
32+
this.wasmBufferByteLen = 0;
3233
}
3334

3435
setMouse (x, y, buttons) {
@@ -103,6 +104,8 @@ export class Runtime {
103104

104105
async load (wasmBuffer) {
105106
const limit = 0xffff;
107+
this.wasmBufferByteLen = wasmBuffer.byteLength;
108+
106109
if (wasmBuffer.byteLength > limit) {
107110
if (DEVELOPER_BUILD) {
108111
if (!this.warnedFileSize) {

0 commit comments

Comments
 (0)