Skip to content

Commit 020f2f2

Browse files
committed
implement ARB_program_interface_query
1 parent 578ee34 commit 020f2f2

File tree

1 file changed

+152
-5
lines changed

1 file changed

+152
-5
lines changed

src/library_webgl2_compute.js

Lines changed: 152 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,27 +21,174 @@ var LibraryWebGL2Compute = {
2121

2222
glGetProgramInterfaceiv__sig: 'viiii',
2323
glGetProgramInterfaceiv: function(program, programInterface, pname, params) {
24-
throw 'glGetProgramInterfaceiv: TODO';
24+
#if GL_ASSERTIONS
25+
GL.validateGLObjectID(GL.programs, program, 'glGetProgramInterfaceiv', 'program');
26+
#endif
27+
switch (pname) {
28+
case 0x92F5: // GL_ACTIVE_RESOURCES
29+
case 0x92F6: // GL_MAX_NAME_LENGTH
30+
case 0x92F7: // GL_MAX_NUM_ACTIVE_VARIABLES
31+
break;
32+
default:
33+
// in case pname is valid for getProgramInterfaceParameter() but the return value is incompatible with an integer
34+
GL.recordError(0x0500); // GL_INVALID_ENUM
35+
return;
36+
}
37+
var ret = GLctx.getProgramInterfaceParameter(GL.programs[program], programInterface, pname);
38+
if (ret === null) return;
39+
{{{ makeSetValue('params', '0', 'ret', 'i32') }}};
2540
},
2641

2742
glGetProgramResourceiv__sig: 'viiiiiiii',
2843
glGetProgramResourceiv: function(program, programInterface, index, propCount, props, bufSize, length, params) {
29-
throw 'glGetProgramResourceiv: TODO';
44+
#if GL_ASSERTIONS
45+
GL.validateGLObjectID(GL.programs, program, 'glGetProgramResourceiv', 'program');
46+
#endif
47+
var i, j;
48+
if (propCount <= 0 || bufSize < 0) {
49+
GL.recordError(0x0501); // GL_INVALID_VALUE
50+
return;
51+
}
52+
var properties = new Array(propCount);
53+
for (i = 0; i < propCount; i++) {
54+
var property = {{{ makeGetValue('props', 'i*4', 'i32') }}};
55+
switch (property) {
56+
case 0x92F9: // GL_NAME_LENGTH
57+
case 0x92FA: // GL_TYPE
58+
case 0x92FB: // GL_ARRAY_SIZE
59+
case 0x92FC: // GL_OFFSET
60+
case 0x92FD: // GL_BLOCK_INDEX
61+
case 0x92FE: // GL_ARRAY_STRIDE
62+
case 0x92FF: // GL_MATRIX_STRIDE
63+
case 0x9300: // GL_IS_ROW_MAJOR
64+
case 0x9301: // GL_ATOMIC_COUNTER_BUFFER_INDEX
65+
case 0x9302: // GL_BUFFER_BINDING
66+
case 0x9303: // GL_BUFFER_DATA_SIZE
67+
case 0x9304: // GL_NUM_ACTIVE_VARIABLES
68+
case 0x9305: // GL_ACTIVE_VARIABLES
69+
case 0x9306: // GL_REFERENCED_BY_VERTEX_SHADER
70+
case 0x930A: // GL_REFERENCED_BY_FRAGMENT_SHADER
71+
case 0x930B: // GL_REFERENCED_BY_COMPUTE_SHADER
72+
case 0x930C: // GL_TOP_LEVEL_ARRAY_SIZE
73+
case 0x930D: // GL_TOP_LEVEL_ARRAY_STRIDE
74+
case 0x930E: // GL_LOCATION
75+
break;
76+
default:
77+
// in case any value in props is valid for getProgramResource() but the return value is incompatible with an integer
78+
GL.recordError(0x0500); // GL_INVALID_ENUM
79+
return;
80+
}
81+
properties[i] = property;
82+
}
83+
var ret = GLctx.getProgramResource(GL.programs[program], programInterface, index, properties);
84+
if (ret === null) return;
85+
var len = 0;
86+
for (i = 0; i < propCount; i++) {
87+
switch (properties[i]) {
88+
case 0x92F9: // GL_NAME_LENGTH
89+
case 0x92FA: // GL_TYPE
90+
case 0x92FB: // GL_ARRAY_SIZE
91+
case 0x92FC: // GL_OFFSET
92+
case 0x92FD: // GL_BLOCK_INDEX
93+
case 0x92FE: // GL_ARRAY_STRIDE
94+
case 0x92FF: // GL_MATRIX_STRIDE
95+
case 0x9300: // GL_IS_ROW_MAJOR
96+
case 0x9301: // GL_ATOMIC_COUNTER_BUFFER_INDEX
97+
case 0x9302: // GL_BUFFER_BINDING
98+
case 0x9303: // GL_BUFFER_DATA_SIZE
99+
case 0x9304: // GL_NUM_ACTIVE_VARIABLES
100+
case 0x9306: // GL_REFERENCED_BY_VERTEX_SHADER
101+
case 0x930A: // GL_REFERENCED_BY_FRAGMENT_SHADER
102+
case 0x930B: // GL_REFERENCED_BY_COMPUTE_SHADER
103+
case 0x930C: // GL_TOP_LEVEL_ARRAY_SIZE
104+
case 0x930D: // GL_TOP_LEVEL_ARRAY_STRIDE
105+
if (len >= bufSize) break;
106+
{{{ makeSetValue('params', 'len*4', 'ret[i]', 'i32') }}};
107+
len++;
108+
break;
109+
case 0x930E: // GL_LOCATION
110+
var loc = -1;
111+
switch (programInterface) {
112+
case 0x92E3: // GL_PROGRAM_INPUT
113+
case 0x92E4: // GL_PROGRAM_OUTPUT
114+
loc = ret[i];
115+
break;
116+
case 0x92E1: // GL_UNIFORM
117+
var str = GLctx.getProgramResourceName(GL.programs[program], programInterface, index);
118+
loc = GL.lookupUniformTable(program, str);
119+
break;
120+
default:
121+
#if GL_ASSERTIONS
122+
err('internal bug: unhandled programInterface in glGetProgramResourceiv');
123+
#endif
124+
}
125+
if (len >= bufSize) break;
126+
{{{ makeSetValue('params', 'len*4', 'loc', 'i32') }}};
127+
len++;
128+
break;
129+
case 0x9305: // GL_ACTIVE_VARIABLES
130+
for (j = 0; j < ret[i].length; j++) {
131+
if (len >= bufSize) break;
132+
{{{ makeSetValue('params', 'len*4', 'ret[i][j]', 'i32') }}};
133+
len++;
134+
}
135+
break;
136+
default:
137+
#if GL_ASSERTIONS
138+
err('internal bug: unhandled value in props in glGetProgramResourceiv');
139+
#endif
140+
}
141+
}
142+
if (length) {
143+
{{{ makeSetValue('length', '0', 'len', 'i32') }}};
144+
}
30145
},
31146

32147
glGetProgramResourceIndex__sig: 'iiii',
33148
glGetProgramResourceIndex: function(program, programInterface, name) {
34-
throw 'glGetProgramResourceIndex: TODO';
149+
#if GL_ASSERTIONS
150+
GL.validateGLObjectID(GL.programs, program, 'glGetProgramResourceIndex', 'program');
151+
#endif
152+
return GLctx.getProgramResourceIndex(GL.programs[program], programInterface, UTF8ToString(name));
35153
},
36154

37155
glGetProgramResourceName__sig: 'viiiiii',
38156
glGetProgramResourceName: function(program, programInterface, index, bufSize, length, name) {
39-
throw 'glGetProgramResourceName: TODO';
157+
#if GL_ASSERTIONS
158+
GL.validateGLObjectID(GL.programs, program, 'glGetProgramResourceName', 'program');
159+
#endif
160+
if (bufSize < 0) {
161+
GL.recordError(0x0501); // GL_INVALID_VALUE
162+
return;
163+
}
164+
var str = GLctx.getProgramResourceName(GL.programs[program], programInterface, index);
165+
if (str === null) return;
166+
var len = stringToUTF8(str, name, bufSize);
167+
if (length) {
168+
{{{ makeSetValue('length', '0', 'len', 'i32') }}};
169+
}
40170
},
41171

42172
glGetProgramResourceLocation__sig: 'iiii',
43173
glGetProgramResourceLocation: function(program, programInterface, name) {
44-
throw 'glGetProgramResourceLocation: TODO';
174+
#if GL_ASSERTIONS
175+
GL.validateGLObjectID(GL.programs, program, 'glGetProgramResourceLocation', 'program');
176+
#endif
177+
var str = UTF8ToString(name);
178+
var loc = GLctx.getProgramResourceLocation(GL.programs[program], programInterface, str);
179+
switch (programInterface) {
180+
case 0x92E3: // GL_PROGRAM_INPUT
181+
case 0x92E4: // GL_PROGRAM_OUTPUT
182+
break;
183+
case 0x92E1: // GL_UNIFORM
184+
loc = GL.lookupUniformTable(program, str);
185+
break;
186+
default:
187+
#if GL_ASSERTIONS
188+
err('internal bug: unhandled programInterface in glGetProgramResourceLocation');
189+
#endif
190+
}
191+
return loc;
45192
},
46193

47194
glProgramUniform1i__sig: 'viii',

0 commit comments

Comments
 (0)