@@ -12,6 +12,22 @@ void main()
1212 gl_FragColor = vec4(0,1,0,1);
1313}
1414` ;
15+ const trivialVsMrtSrc = `#version 300 es
16+ void main()
17+ {
18+ gl_Position = vec4(0,0,0,1);
19+ }
20+ ` ;
21+ const trivialFsMrtSrc = `#version 300 es
22+ precision mediump float;
23+ layout(location = 0) out vec4 o_color0;
24+ layout(location = 1) out vec4 o_color1;
25+ void main()
26+ {
27+ o_color0 = vec4(1, 0, 0, 1);
28+ o_color1 = vec4(0, 1, 0, 1);
29+ }
30+ ` ;
1531
1632function testExtFloatBlend ( shouldBlend , internalFormat ) {
1733 const prog = wtu . setupProgram ( gl , [ trivialVsSrc , trivialFsSrc ] ) ;
@@ -34,6 +50,118 @@ function testExtFloatBlend(shouldBlend, internalFormat) {
3450 gl . drawArrays ( gl . POINTS , 0 , 1 ) ;
3551 wtu . glErrorShouldBe ( gl , shouldBlend ? 0 : gl . INVALID_OPERATION ,
3652 'Float32 blending is ' + ( shouldBlend ? '' : 'not ' ) + 'allowed ' ) ;
53+
54+ gl . deleteFramebuffer ( fb ) ;
55+ gl . deleteTexture ( tex ) ;
56+ }
57+
58+ function testExtFloatBlendMRT ( shouldBlend ) {
59+ const prog = wtu . setupProgram ( gl , [ trivialVsMrtSrc , trivialFsMrtSrc ] ) ;
60+ gl . useProgram ( prog ) ;
61+
62+ const tex1 = gl . createTexture ( ) ;
63+ gl . bindTexture ( gl . TEXTURE_2D , tex1 ) ;
64+ gl . texImage2D ( gl . TEXTURE_2D , 0 , gl . RGBA , 1 , 1 , 0 , gl . RGBA , gl . UNSIGNED_BYTE , null ) ;
65+
66+ const tex2 = gl . createTexture ( ) ;
67+ gl . bindTexture ( gl . TEXTURE_2D , tex2 ) ;
68+ gl . texImage2D ( gl . TEXTURE_2D , 0 , gl . RGBA , 1 , 1 , 0 , gl . RGBA , gl . UNSIGNED_BYTE , null ) ;
69+
70+ const texF1 = gl . createTexture ( ) ;
71+ gl . bindTexture ( gl . TEXTURE_2D , texF1 ) ;
72+ gl . texImage2D ( gl . TEXTURE_2D , 0 , gl . RGBA32F , 1 , 1 , 0 , gl . RGBA , gl . FLOAT , null ) ;
73+
74+ const texF2 = gl . createTexture ( ) ;
75+ gl . bindTexture ( gl . TEXTURE_2D , texF2 ) ;
76+ gl . texImage2D ( gl . TEXTURE_2D , 0 , gl . RGBA32F , 1 , 1 , 0 , gl . RGBA , gl . FLOAT , null ) ;
77+
78+ const fb = gl . createFramebuffer ( ) ;
79+ gl . bindFramebuffer ( gl . FRAMEBUFFER , fb ) ;
80+ gl . framebufferTexture2D ( gl . FRAMEBUFFER , gl . COLOR_ATTACHMENT0 , gl . TEXTURE_2D , tex1 , 0 ) ;
81+ gl . framebufferTexture2D ( gl . FRAMEBUFFER , gl . COLOR_ATTACHMENT1 , gl . TEXTURE_2D , tex2 , 0 ) ;
82+ shouldBe ( 'gl.checkFramebufferStatus(gl.FRAMEBUFFER)' , 'gl.FRAMEBUFFER_COMPLETE' ) ;
83+
84+ gl . drawBuffers ( [ gl . COLOR_ATTACHMENT0 , gl . COLOR_ATTACHMENT1 ] ) ;
85+
86+ gl . enable ( gl . BLEND ) ;
87+
88+ gl . drawArrays ( gl . POINTS , 0 , 1 ) ;
89+ wtu . glErrorShouldBe ( gl , 0 , 'No Float32 color attachment' ) ;
90+
91+ gl . framebufferTexture2D ( gl . FRAMEBUFFER , gl . COLOR_ATTACHMENT0 , gl . TEXTURE_2D , texF1 , 0 ) ;
92+ gl . drawArrays ( gl . POINTS , 0 , 1 ) ;
93+ wtu . glErrorShouldBe ( gl , shouldBlend ? 0 : gl . INVALID_OPERATION ,
94+ 'Float32 blending is ' + ( shouldBlend ? '' : 'not ' ) + 'allowed ' ) ;
95+
96+ gl . framebufferTexture2D ( gl . FRAMEBUFFER , gl . COLOR_ATTACHMENT1 , gl . TEXTURE_2D , texF2 , 0 ) ;
97+ gl . drawArrays ( gl . POINTS , 0 , 1 ) ;
98+ wtu . glErrorShouldBe ( gl , shouldBlend ? 0 : gl . INVALID_OPERATION ,
99+ 'Float32 blending is ' + ( shouldBlend ? '' : 'not ' ) + 'allowed ' ) ;
100+
101+ gl . framebufferTexture2D ( gl . FRAMEBUFFER , gl . COLOR_ATTACHMENT0 , gl . TEXTURE_2D , tex1 , 0 ) ;
102+ gl . drawArrays ( gl . POINTS , 0 , 1 ) ;
103+ wtu . glErrorShouldBe ( gl , shouldBlend ? 0 : gl . INVALID_OPERATION ,
104+ 'Float32 blending is ' + ( shouldBlend ? '' : 'not ' ) + 'allowed ' ) ;
105+
106+ gl . drawBuffers ( [ gl . COLOR_ATTACHMENT0 ] ) ;
107+ shouldBe ( 'gl.checkFramebufferStatus(gl.FRAMEBUFFER)' , 'gl.FRAMEBUFFER_COMPLETE' ) ;
108+
109+ gl . drawArrays ( gl . POINTS , 0 , 1 ) ;
110+ wtu . glErrorShouldBe ( gl , 0 , 'Float32 color attachment draw buffer is not enabled' ) ;
111+
112+ gl . drawBuffers ( [ gl . COLOR_ATTACHMENT0 , gl . COLOR_ATTACHMENT1 ] ) ;
113+ gl . framebufferTexture2D ( gl . FRAMEBUFFER , gl . COLOR_ATTACHMENT1 , gl . TEXTURE_2D , tex2 , 0 ) ;
114+ shouldBe ( 'gl.checkFramebufferStatus(gl.FRAMEBUFFER)' , 'gl.FRAMEBUFFER_COMPLETE' ) ;
115+
116+ gl . drawArrays ( gl . POINTS , 0 , 1 ) ;
117+ wtu . glErrorShouldBe ( gl , 0 , 'No Float32 color attachment' ) ;
118+
119+ gl . deleteFramebuffer ( fb ) ;
120+ gl . deleteTexture ( tex1 ) ;
121+ gl . deleteTexture ( tex2 ) ;
122+ gl . deleteTexture ( texF1 ) ;
123+ gl . deleteTexture ( texF2 ) ;
124+ }
125+
126+ function testExtFloatBlendNonFloat32Type ( shouldBlend ) {
127+ const prog = wtu . setupProgram ( gl , [ trivialVsSrc , trivialFsSrc ] ) ;
128+ gl . useProgram ( prog ) ;
129+
130+ gl . enable ( gl . BLEND ) ;
131+
132+ const tex = gl . createTexture ( ) ;
133+ gl . bindTexture ( gl . TEXTURE_2D , tex ) ;
134+ gl . texImage2D ( gl . TEXTURE_2D , 0 , gl . RGBA32F , 1 , 1 , 0 , gl . RGBA , gl . FLOAT , null ) ;
135+
136+ const fb = gl . createFramebuffer ( ) ;
137+ gl . bindFramebuffer ( gl . FRAMEBUFFER , fb ) ;
138+ gl . framebufferTexture2D ( gl . FRAMEBUFFER , gl . COLOR_ATTACHMENT0 , gl . TEXTURE_2D , tex , 0 ) ;
139+ shouldBe ( 'gl.checkFramebufferStatus(gl.FRAMEBUFFER)' , 'gl.FRAMEBUFFER_COMPLETE' ) ;
140+
141+ gl . drawArrays ( gl . POINTS , 0 , 1 ) ;
142+ wtu . glErrorShouldBe ( gl , shouldBlend ? 0 : gl . INVALID_OPERATION ,
143+ 'Float32 blending is ' + ( shouldBlend ? '' : 'not ' ) + 'allowed ' ) ;
144+
145+ gl . texImage2D ( gl . TEXTURE_2D , 0 , gl . RGBA , 1 , 1 , 0 , gl . RGBA , gl . UNSIGNED_BYTE , null ) ;
146+ gl . drawArrays ( gl . POINTS , 0 , 1 ) ;
147+ wtu . glErrorShouldBe ( gl , 0 , 'UNSIGNED_BYTE should blend anyway' ) ;
148+
149+ const formats = [
150+ [ gl . RGBA16F , gl . RGBA , gl . HALF_FLOAT ] ,
151+ [ gl . RGBA16F , gl . RGBA , gl . FLOAT ] ,
152+ [ gl . RG16F , gl . RG , gl . FLOAT ] ,
153+ [ gl . R16F , gl . RED , gl . FLOAT ] ,
154+ [ gl . R11F_G11F_B10F , gl . RGB , gl . FLOAT ]
155+ ] ;
156+
157+ for ( let i = 0 , len = formats . length ; i < len ; i ++ ) {
158+ gl . texImage2D ( gl . TEXTURE_2D , 0 , formats [ i ] [ 0 ] , 1 , 1 , 0 , formats [ i ] [ 1 ] , formats [ i ] [ 2 ] , null ) ;
159+ gl . drawArrays ( gl . POINTS , 0 , 1 ) ;
160+ wtu . glErrorShouldBe ( gl , 0 , 'Any other float type which is not 32-bit-Float should blend anyway' ) ;
161+ }
162+
163+ gl . deleteFramebuffer ( fb ) ;
164+ gl . deleteTexture ( tex ) ;
37165}
38166
39167/*
0 commit comments