Skip to content

Commit 22604e9

Browse files
Merge pull request gpujs#664 from stopyoukid/fix/pipeline-texture-crash
fix: crash when using a pipeline kernel + constant texture
2 parents 8634a6c + 40a83ec commit 22604e9

File tree

4 files changed

+74
-4
lines changed

4 files changed

+74
-4
lines changed

src/backend/web-gl/kernel-value/memory-optimized-number-texture.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class WebGLKernelValueMemoryOptimizedNumberTexture extends WebGLKernelArray {
4747
if (kernel.immutable) {
4848
kernel.updateTextureArgumentRefs(this, inputTexture);
4949
} else {
50-
if (kernel.texture.texture === inputTexture.texture) {
50+
if (kernel.texture && kernel.texture.texture === inputTexture.texture) {
5151
throw new Error(sameError);
5252
} else if (kernel.mappedTextures) {
5353
const { mappedTextures } = kernel;
@@ -69,4 +69,4 @@ class WebGLKernelValueMemoryOptimizedNumberTexture extends WebGLKernelArray {
6969
module.exports = {
7070
WebGLKernelValueMemoryOptimizedNumberTexture,
7171
sameError
72-
};
72+
};

src/backend/web-gl/kernel-value/number-texture.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class WebGLKernelValueNumberTexture extends WebGLKernelArray {
4949
if (kernel.immutable) {
5050
kernel.updateTextureArgumentRefs(this, inputTexture);
5151
} else {
52-
if (kernel.texture.texture === inputTexture.texture) {
52+
if (kernel.texture && kernel.texture.texture === inputTexture.texture) {
5353
throw new Error(sameError);
5454
} else if (kernel.mappedTextures) {
5555
const { mappedTextures } = kernel;
@@ -70,4 +70,4 @@ class WebGLKernelValueNumberTexture extends WebGLKernelArray {
7070

7171
module.exports = {
7272
WebGLKernelValueNumberTexture
73-
};
73+
};

test/internal/backend/web-gl/kernel-value/memory-optimized-number-texture.js

+35
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,38 @@ test('.constructor() checks ok height & width', () => {
7676
});
7777
assert.equal(v.constructor.name, 'WebGLKernelValueMemoryOptimizedNumberTexture');
7878
});
79+
80+
test('.updateValue() should set uploadValue when a pipeline kernel has no texture', () => {
81+
const mockKernel = {
82+
constructor: {
83+
features: { maxTextureSize: 2 },
84+
},
85+
validate: true,
86+
pipeline: true,
87+
setUniform3iv: () => {},
88+
setUniform2iv: () => {},
89+
setUniform1i: () => {},
90+
};
91+
const mockContext = {
92+
activeTexture: () => {},
93+
bindTexture: () => {},
94+
texParameteri: () => {},
95+
pixelStorei: () => {},
96+
texImage2D: () => {},
97+
};
98+
const v = new webGLKernelValueMaps.unsigned.static.MemoryOptimizedNumberTexture({ size: [2,2], context: mockContext }, {
99+
kernel: mockKernel,
100+
name: 'test',
101+
type: 'MemoryOptimizedNumberTexture',
102+
origin: 'user',
103+
tactic: 'speed',
104+
context: mockContext,
105+
onRequestContextHandle: () => 1,
106+
onRequestTexture: () => null,
107+
onRequestIndex: () => 1
108+
});
109+
110+
const newMockTexture = {}
111+
v.updateValue({ size: [2,2], context: mockContext, texture: newMockTexture })
112+
assert.equal(v.uploadValue, newMockTexture)
113+
});

test/internal/backend/web-gl/kernel-value/number-texture.js

+35
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,38 @@ test('.constructor() checks ok height & width', () => {
7676
});
7777
assert.equal(v.constructor.name, 'WebGLKernelValueNumberTexture');
7878
});
79+
80+
test('.updateValue() should set uploadValue when a pipeline kernel has no texture', () => {
81+
const mockKernel = {
82+
constructor: {
83+
features: { maxTextureSize: 2 },
84+
},
85+
pipeline: true,
86+
validate: true,
87+
setUniform3iv: () => {},
88+
setUniform2iv: () => {},
89+
setUniform1i: () => {},
90+
};
91+
const mockContext = {
92+
activeTexture: () => {},
93+
bindTexture: () => {},
94+
texParameteri: () => {},
95+
pixelStorei: () => {},
96+
texImage2D: () => {},
97+
};
98+
const v = new webGLKernelValueMaps.unsigned.static.NumberTexture({ size: [2,2], context: mockContext }, {
99+
kernel: mockKernel,
100+
name: 'test',
101+
type: 'NumberTexture',
102+
origin: 'user',
103+
tactic: 'speed',
104+
context: mockContext,
105+
onRequestContextHandle: () => 1,
106+
onRequestTexture: () => null,
107+
onRequestIndex: () => 1
108+
});
109+
110+
const newMockTexture = {}
111+
v.updateValue({ size: [2,2], context: mockContext, texture: newMockTexture })
112+
assert.equal(v.uploadValue, newMockTexture)
113+
});

0 commit comments

Comments
 (0)