Skip to content

Commit 8ebe7d9

Browse files
committed
Translated Shaders
1 parent ae30019 commit 8ebe7d9

8 files changed

Lines changed: 46 additions & 6 deletions

File tree

dist/spector.bundle.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

documentation/changeLogs.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
Please, find below the per release summary of the contribution added to the project per version. Each of the listed versions is having its corresponding tag in the repo.
66

77
## v0.9.19
8+
* Add Support for [translated shaders](https://github.com/BabylonJS/Spector.js/issues/175) in the extension.
89

910
## v0.9.18
1011
* Add Toggle for [fullscreen textures](https://github.com/BabylonJS/Spector.js/issues/145) in the extension.

extensions/spector.bundle.func.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

extensions/spector.bundle.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/backend/utils/readProgramHelper.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ export class ReadProgramHelper {
3434

3535
private static readShaderFromContext(context: WebGLRenderingContexts, shader: WebGLShader): IShaderCapture {
3636
const source = context.getShaderSource(shader);
37+
const ext = context.getExtension("WEBGL_debug_shaders");
38+
const translatedSource = ext ? ext.getTranslatedShaderSource(shader) : null;
3739

3840
const shaderTypeValue = context.getShaderParameter(shader, WebGlConstants.SHADER_TYPE.value);
3941
const isFragment = shaderTypeValue === WebGlConstants.FRAGMENT_SHADER.value;
@@ -52,6 +54,7 @@ export class ReadProgramHelper {
5254
fragment: isFragment,
5355
name,
5456
source,
57+
translatedSource,
5558
};
5659
}
5760

src/embeddedFrontend/resultView/resultView.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ import { MDNCommandLinkHelper } from "./commandList/mdnCommandLinkHelper";
2828
export interface ISourceCodeChangeEvent {
2929
sourceVertex: string;
3030
sourceFragment: string;
31+
translatedSourceVertex: string;
32+
translatedSourceFragment: string;
3133
programId: number;
3234
}
3335

@@ -146,21 +148,37 @@ export class ResultView {
146148
this.sourceCodeComponent.onSourceCodeCloseClicked.add(() => {
147149
this.displayCurrentCapture();
148150
});
151+
this.sourceCodeComponent.onTranslatedVertexSourceClicked.add((sourceCodeState) => {
152+
const state = this.mvx.getGenericState<ISourceCodeState>(this.sourceCodeComponentStateId);
153+
state.fragment = false;
154+
state.translated = true;
155+
this.mvx.updateState(this.sourceCodeComponentStateId, state);
156+
});
157+
this.sourceCodeComponent.onTranslatedFragmentSourceClicked.add((sourceCodeState) => {
158+
const state = this.mvx.getGenericState<ISourceCodeState>(this.sourceCodeComponentStateId);
159+
state.fragment = true;
160+
state.translated = true;
161+
this.mvx.updateState(this.sourceCodeComponentStateId, state);
162+
});
149163
this.sourceCodeComponent.onVertexSourceClicked.add((sourceCodeState) => {
150164
const state = this.mvx.getGenericState<ISourceCodeState>(this.sourceCodeComponentStateId);
151165
state.fragment = false;
166+
state.translated = false;
152167
this.mvx.updateState(this.sourceCodeComponentStateId, state);
153168
});
154169
this.sourceCodeComponent.onFragmentSourceClicked.add((sourceCodeState) => {
155170
const state = this.mvx.getGenericState<ISourceCodeState>(this.sourceCodeComponentStateId);
156171
state.fragment = true;
172+
state.translated = false;
157173
this.mvx.updateState(this.sourceCodeComponentStateId, state);
158174
});
159175
this.sourceCodeComponent.onSourceCodeChanged.add((sourceCodeState) => {
160176
this.onSourceCodeChanged.trigger({
161177
programId: sourceCodeState.state.programId,
162178
sourceFragment: sourceCodeState.state.sourceFragment,
163179
sourceVertex: sourceCodeState.state.sourceVertex,
180+
translatedSourceFragment: sourceCodeState.state.translatedSourceFragment,
181+
translatedSourceVertex: sourceCodeState.state.translatedSourceVertex,
164182
});
165183
});
166184

@@ -263,7 +281,10 @@ export class ResultView {
263281
nameFragment: commandState.capture.DrawCall.shaders[1].name,
264282
sourceVertex: commandState.capture.DrawCall.shaders[0].source,
265283
sourceFragment: commandState.capture.DrawCall.shaders[1].source,
284+
translatedSourceVertex: commandState.capture.DrawCall.shaders[0].translatedSource,
285+
translatedSourceFragment: commandState.capture.DrawCall.shaders[1].translatedSource,
266286
fragment,
287+
translated: false,
267288
editable: commandState.capture.DrawCall.programStatus.RECOMPILABLE,
268289
}, this.sourceCodeComponent);
269290

src/embeddedFrontend/resultView/sourceCode/sourceCodeComponent.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export interface ISourceCodeState extends ISourceCodeChangeEvent {
55
nameVertex: string;
66
nameFragment: string;
77
fragment: boolean;
8+
translated: boolean;
89
editable: boolean;
910
}
1011

@@ -34,6 +35,8 @@ export class SourceCodeComponent extends BaseComponent<ISourceCodeState> {
3435
private static readonly closeCurlyReplacementKey = "[[[closeCurlyReplacementKey]]]";
3536
private static readonly closeCurlyReplacementKeyRegex = new RegExp("\\[\\[\\[closeCurlyReplacementKey\\]\\]\\]", "g");
3637

38+
public onTranslatedVertexSourceClicked: IStateEvent<ISourceCodeState>;
39+
public onTranslatedFragmentSourceClicked: IStateEvent<ISourceCodeState>;
3740
public onVertexSourceClicked: IStateEvent<ISourceCodeState>;
3841
public onFragmentSourceClicked: IStateEvent<ISourceCodeState>;
3942
public onSourceCodeCloseClicked: IStateEvent<ISourceCodeState>;
@@ -43,6 +46,8 @@ export class SourceCodeComponent extends BaseComponent<ISourceCodeState> {
4346

4447
constructor() {
4548
super();
49+
this.onTranslatedVertexSourceClicked = this.createEvent("onTranslatedVertexSourceClicked");
50+
this.onTranslatedFragmentSourceClicked = this.createEvent("onTranslatedFragmentSourceClicked");
4651
this.onVertexSourceClicked = this.createEvent("onVertexSourceClicked");
4752
this.onFragmentSourceClicked = this.createEvent("onFragmentSourceClicked");
4853
this.onSourceCodeCloseClicked = this.createEvent("onSourceCodeCloseClicked");
@@ -77,14 +82,23 @@ export class SourceCodeComponent extends BaseComponent<ISourceCodeState> {
7782

7883
public render(state: ISourceCodeState, stateId: number): Element {
7984
const source = state.fragment ? state.sourceFragment : state.sourceVertex;
80-
const formattedShader = source ? this._indentIfdef(this._beautify(source)) : "";
85+
let formattedShader: string;
86+
// tslint:disable-next-line:prefer-conditional-expression
87+
if (state.translated) {
88+
formattedShader = state.fragment ? state.translatedSourceFragment : state.translatedSourceVertex;
89+
}
90+
else {
91+
formattedShader = source ? this._indentIfdef(this._beautify(source)) : "";
92+
}
8193

8294
const htmlString = this.htmlTemplate`
8395
<div class="sourceCodeComponentContainer">
8496
<div class="sourceCodeMenuComponentContainer">
8597
<ul class="sourceCodeMenuComponent">
86-
<li><a class="${state.fragment ? "" : "active"}" href="#" role="button" commandName="onVertexSourceClicked">Vertex</a></li>
87-
<li><a class="${state.fragment ? "active" : ""}" href="#" role="button" commandName="onFragmentSourceClicked">Fragment</a></li>
98+
${ state.translatedSourceVertex ? this.htmlTemplate`<li><a class="${!state.fragment && state.translated ? "active" : ""}" href="#" role="button" commandName="onTranslatedVertexSourceClicked">Translated Vertex</a></li>` : "" }
99+
${ state.translatedSourceFragment ? this.htmlTemplate`<li><a class="${state.fragment && state.translated ? "active" : ""}" href="#" role="button" commandName="onTranslatedFragmentSourceClicked">Translated Fragment</a></li>` : "" }
100+
<li><a class="${!state.fragment && !state.translated ? "active" : ""}" href="#" role="button" commandName="onVertexSourceClicked">Vertex</a></li>
101+
<li><a class="${state.fragment && !state.translated ? "active" : ""}" href="#" role="button" commandName="onFragmentSourceClicked">Fragment</a></li>
88102
<li><a href="#" role="button" commandName="onSourceCodeCloseClicked">Close</a></li>
89103
</ul>
90104
</div>

src/shared/capture/programCapture.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ export interface IShaderCapture {
33
fragment: boolean;
44
name: string;
55
source: string;
6+
translatedSource: string;
67
}
78

89
export interface IProgramStatus {

0 commit comments

Comments
 (0)