@@ -21,27 +21,174 @@ var LibraryWebGL2Compute = {
21
21
22
22
glGetProgramInterfaceiv__sig : 'viiii' ,
23
23
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' ) } } } ;
25
40
} ,
26
41
27
42
glGetProgramResourceiv__sig : 'viiiiiiii' ,
28
43
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
+ }
30
145
} ,
31
146
32
147
glGetProgramResourceIndex__sig: 'iiii' ,
33
148
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 ) ) ;
35
153
} ,
36
154
37
155
glGetProgramResourceName__sig : 'viiiiii' ,
38
156
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
+ }
40
170
} ,
41
171
42
172
glGetProgramResourceLocation__sig : 'iiii' ,
43
173
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 ;
45
192
} ,
46
193
47
194
glProgramUniform1i__sig : 'viii' ,
0 commit comments