179
207
FloatMat4Attribute& a = dynamic_cast<FloatMat4Attribute&>(av);
180
208
FloatMat4 r = a.get();
181
209
EXPECT_EQ(in, r);
186
template<typename T, typename U>
190
// Type-specific test
193
EXPECT_EQ(u.get(), val);
196
EXPECT_EQ(u.get(), val);
198
// Assignment to base.
200
UniformVariable& v(u);
202
EXPECT_EQ(u.get(), val);
204
EXPECT_EQ(u.get(), val);
207
TEST(Uniform, uniforms)
209
auto rt = Runtime::create();
210
rt->create_display(200, 200);
212
// Shader with all possible types of uniform. Silly use of these in the body of the shader, so they
213
// are not optimized out of existence.
214
const char* v_source = "uniform float f;"
221
"uniform float fa[2];"
222
"uniform vec2 fv2a[2];"
223
"uniform vec3 fv3a[2];"
224
"uniform vec4 fv4a[2];"
225
"uniform mat2 fm2a[2];"
226
"uniform mat3 fm3a[2];"
227
"uniform mat4 fm4a[2];"
233
"uniform ivec2 iv2a[2];"
234
"uniform ivec3 iv3a[2];"
235
"uniform ivec4 iv4a[2];"
240
"uniform bool ba[2];"
241
"uniform bvec2 bv2a[2];"
242
"uniform bvec3 bv3a[2];"
243
"uniform bvec4 bv4a[2];"
246
" gl_Position = vec4(f + fv2.x + fv3.x + fv4.x);"
247
" gl_Position = gl_Position + vec4(fm2[0][0] + fm3[0][0] + fm4[0][0]);"
248
" gl_Position = gl_Position + vec4(fa[1] + fv2a[1].x + fv3a[1].x + fv4a[1].x);"
249
" gl_Position = gl_Position + vec4(fm2a[1][0][0] + fm3a[1][0][0] + fm4a[1][0][0]);"
250
" gl_Position = gl_Position + vec4(i + iv2.x + iv3.x + iv4.x);"
251
" gl_Position = gl_Position + vec4(ia[1] + iv2a[1].x + iv3a[1].x + iv4a[1].x);"
252
" gl_Position = gl_Position + vec4(int(b) + int(bv2.x) + int(bv3.x) + int(bv4.x));"
253
" gl_Position = gl_Position + vec4(int(ba[1]) + int(bv2a[1]) + int(bv3a[1]) + int(bv4a[1]));"
256
const char* f_source = "uniform sampler2D s;"
257
"uniform sampler2D sa[2];"
258
"uniform samplerCube c;"
259
"uniform samplerCube ca[2];"
262
" gl_FragColor = texture2D(s, vec2(0));"
263
" gl_FragColor = gl_FragColor + texture2D(sa[1], vec2(0));"
264
" gl_FragColor = gl_FragColor + textureCube(c, vec3(0));"
265
" gl_FragColor = gl_FragColor + textureCube(ca[1], vec3(0));"
271
auto v = VertexShader::create(v_source);
272
auto f = FragmentShader::create(f_source);
273
p = Program::create(*v, *f);
276
catch (const Exception& e)
278
FAIL() << e.to_string();
286
UniformVariable& uv = p->uniform("f");
287
FloatUniform& u = dynamic_cast<FloatUniform&>(uv);
289
EXPECT_EQ(0.5f, u.get());
291
assign_test<GLfloat>(u);
295
UniformVariable& uv = p->uniform("fv2");
296
FloatVec2Uniform& u = dynamic_cast<FloatVec2Uniform&>(uv);
297
u = { { 0.1f, 0.2f } };
298
EXPECT_EQ(0.1f, u.get()[0]);
299
EXPECT_EQ(0.2f, u.get()[1]);
301
u.set(0.0f, 0.1f); // Separate parameter interface
307
assign_test<FloatVec2>(u);
311
UniformVariable& uv = p->uniform("fv3");
312
FloatVec3Uniform& u = dynamic_cast<FloatVec3Uniform&>(uv);
313
u.set({ { 0.1f, 0.2f, 0.3f } });
314
EXPECT_EQ(0.1f, u.get()[0]);
315
EXPECT_EQ(0.2f, u.get()[1]);
316
EXPECT_EQ(0.3f, u.get()[2]);
318
u.set(0.0f, 0.1f, 0.2f); // Separate parameter interface
326
EXPECT_EQ(u.get(), val);
329
EXPECT_EQ(u.get(), val);
331
assign_test<FloatVec3>(u);
335
UniformVariable& uv = p->uniform("fv4");
336
FloatVec4Uniform& u = dynamic_cast<FloatVec4Uniform&>(uv);
337
u.set({ { 0.1f, 0.2f, 0.3f, 0.4f } });
338
EXPECT_EQ(0.1f, u.get()[0]);
339
EXPECT_EQ(0.2f, u.get()[1]);
340
EXPECT_EQ(0.3f, u.get()[2]);
341
EXPECT_EQ(0.4f, u.get()[3]);
343
u.set(0.0f, 0.1f, 0.2f, 0.3f); // Separate parameter interface
351
assign_test<FloatVec4>(u);
355
UniformVariable& uv = p->uniform("fm2");
356
FloatMat2Uniform& u = dynamic_cast<FloatMat2Uniform&>(uv);
357
FloatMat2 m = { { { { 1.0f, 2.0f } },
358
{ { 3.0f, 4.0f } } } };
360
EXPECT_EQ(m, u.get());
362
assign_test<FloatMat2>(u);
366
UniformVariable& uv = p->uniform("fm3");
367
FloatMat3Uniform& u = dynamic_cast<FloatMat3Uniform&>(uv);
368
FloatMat3 m = { { { { 1.0f, 2.0f, 3.0f } },
369
{ { 4.0f, 5.0f, 6.0f } },
370
{ { 7.0f, 8.0f, 9.0f } } } };
372
EXPECT_EQ(m, u.get());
374
assign_test<FloatMat3>(u);
378
UniformVariable& uv = p->uniform("fm4");
379
FloatMat4Uniform& u = dynamic_cast<FloatMat4Uniform&>(uv);
380
FloatMat4 m = { { { { 1.0f, 2.0f, 3.0f, 4.0f } },
381
{ { 5.0f, 6.0f, 7.0f, 8.0f } },
382
{ { 9.0f, 10.0f, 11.0f, 12.0f } },
383
{ { 13.0f, 14.0f, 15.0f, 16.0f } } } };
385
EXPECT_EQ(m, u.get());
387
assign_test<FloatMat4>(u);
393
UniformVariable& uv = p->uniform("fa");
394
FloatArrayUniform& u = dynamic_cast<FloatArrayUniform&>(uv);
395
u.set({ { 0.1f, 0.2f } });
396
EXPECT_EQ(0.1f, u.get()[0]);
397
EXPECT_EQ(0.2f, u.get()[1]);
399
assign_test<FloatArray>(u);
400
size_test<GLfloat>(u);
404
UniformVariable& uv = p->uniform("fv2a");
405
FloatVec2ArrayUniform& u = dynamic_cast<FloatVec2ArrayUniform&>(uv);
406
FloatVec2Array a { { { { 1.0f, 2.0f } },
407
{ { 3.0f, 4.0f } } } };
409
EXPECT_EQ(a, u.get());
411
assign_test<FloatVec2Array>(u);
412
size_test<FloatVec2>(u);
416
UniformVariable& uv = p->uniform("fv3a");
417
FloatVec3ArrayUniform& u = dynamic_cast<FloatVec3ArrayUniform&>(uv);
418
FloatVec3Array a { { { { 1.0f, 2.0f, 3.0f } },
419
{ { 4.0f, 5.0f, 6.0f } } } };
421
EXPECT_EQ(a, u.get());
423
assign_test<FloatVec3Array>(u);
424
size_test<FloatVec3>(u);
428
UniformVariable& uv = p->uniform("fv4a");
429
FloatVec4ArrayUniform& u = dynamic_cast<FloatVec4ArrayUniform&>(uv);
430
FloatVec4Array a { { { { 1.0f, 2.0f, 3.0f, 4.0f } },
431
{ { 3.0f, 4.0f, 5.0f, 8.0f } } } };
433
EXPECT_EQ(a, u.get());
435
assign_test<FloatVec4Array>(u);
436
size_test<FloatVec4>(u);
440
UniformVariable& uv = p->uniform("fm2a");
441
FloatMat2ArrayUniform& u = dynamic_cast<FloatMat2ArrayUniform&>(uv);
443
{ { { { 1.0f, 2.0f } },
444
{ { 3.0f, 4.0f } } } },
445
{ { { { 5.0f, 6.0f } },
446
{ { 7.0f, 8.0f } } } }
449
EXPECT_EQ(a, u.get());
451
assign_test<FloatMat2Array>(u);
452
size_test<FloatMat2>(u);
456
UniformVariable& uv = p->uniform("fm3a");
457
FloatMat3ArrayUniform& u = dynamic_cast<FloatMat3ArrayUniform&>(uv);
459
{ { { { 1.0f, 2.0f, 3.0f } },
460
{ { 4.0f, 5.0f, 6.0f } },
461
{ { 7.0f, 8.0f, 9.0f } } } },
462
{ { { { 10.0f, 11.0f, 12.0f } },
463
{ { 13.0f, 14.0f, 15.0f } },
464
{ { 16.0f, 17.0f, 18.0f } } } }
467
EXPECT_EQ(a, u.get());
469
assign_test<FloatMat3Array>(u);
470
size_test<FloatMat3>(u);
474
UniformVariable& uv = p->uniform("fm4a");
475
FloatMat4ArrayUniform& u = dynamic_cast<FloatMat4ArrayUniform&>(uv);
477
{ { { { 1.0f, 2.0f, 3.0f, 4.0f } },
478
{ { 5.0f, 6.0f, 7.0f, 8.0f } },
479
{ { 9.0f, 10.0f, 11.0f, 12.0f } },
480
{ { 13.0f, 14.0f, 15.0f, 16.0f } } } },
481
{ { { { 21.0f, 22.0f, 23.0f, 24.0f } },
482
{ { 25.0f, 26.0f, 27.0f, 28.0f } },
483
{ { 29.0f, 20.0f, 21.0f, 22.0f } },
484
{ { 23.0f, 24.0f, 25.0f, 26.0f } } } },
487
EXPECT_EQ(a, u.get());
489
assign_test<FloatMat4Array>(u);
490
size_test<FloatMat4>(u);
496
UniformVariable& uv = p->uniform("i");
497
IntUniform& u = dynamic_cast<IntUniform&>(uv);
499
EXPECT_EQ(99, u.get());
501
assign_test<GLint>(u);
505
UniformVariable& uv = p->uniform("iv2");
506
IntVec2Uniform& u = dynamic_cast<IntVec2Uniform&>(uv);
508
EXPECT_EQ(1, u.get()[0]);
509
EXPECT_EQ(2, u.get()[1]);
511
u.set(0, 1); // Separate parameter interface
517
assign_test<IntVec2>(u);
521
UniformVariable& uv = p->uniform("iv3");
522
IntVec3Uniform& u = dynamic_cast<IntVec3Uniform&>(uv);
523
u.set({ { 1, 2, 3 } });
524
EXPECT_EQ(1, u.get()[0]);
525
EXPECT_EQ(2, u.get()[1]);
526
EXPECT_EQ(3, u.get()[2]);
528
u.set(0, 1, 2); // Separate parameter interface
535
assign_test<IntVec3>(u);
539
UniformVariable& uv = p->uniform("iv4");
540
IntVec4Uniform& u = dynamic_cast<IntVec4Uniform&>(uv);
541
u.set({ { 1, 2, 3, 4 } });
542
EXPECT_EQ(1, u.get()[0]);
543
EXPECT_EQ(2, u.get()[1]);
544
EXPECT_EQ(3, u.get()[2]);
545
EXPECT_EQ(4, u.get()[3]);
547
u.set(0, 1, 2, 3); // Separate parameter interface
555
assign_test<IntVec4>(u);
561
UniformVariable& uv = p->uniform("ia");
562
IntArrayUniform& u = dynamic_cast<IntArrayUniform&>(uv);
564
EXPECT_EQ(1, u.get()[0]);
565
EXPECT_EQ(2, u.get()[1]);
567
assign_test<IntArray>(u);
572
UniformVariable& uv = p->uniform("iv2a");
573
IntVec2ArrayUniform& u = dynamic_cast<IntVec2ArrayUniform&>(uv);
579
EXPECT_EQ(a, u.get());
581
assign_test<IntVec2Array>(u);
582
size_test<IntVec2>(u);
586
UniformVariable& uv = p->uniform("iv3a");
587
IntVec3ArrayUniform& u = dynamic_cast<IntVec3ArrayUniform&>(uv);
593
EXPECT_EQ(a, u.get());
595
assign_test<IntVec3Array>(u);
596
size_test<IntVec3>(u);
600
UniformVariable& uv = p->uniform("iv4a");
601
IntVec4ArrayUniform& u = dynamic_cast<IntVec4ArrayUniform&>(uv);
607
EXPECT_EQ(a, u.get());
609
assign_test<IntVec4Array>(u);
610
size_test<IntVec4>(u);
616
UniformVariable& uv = p->uniform("b");
617
BoolUniform& u = dynamic_cast<BoolUniform&>(uv);
619
EXPECT_EQ(GL_TRUE, u.get());
621
EXPECT_EQ(GL_FALSE, u.get());
623
assign_test<GLboolean>(u);
627
UniformVariable& uv = p->uniform("bv2");
628
BoolVec2Uniform& u = dynamic_cast<BoolVec2Uniform&>(uv);
629
u.set({ { GL_TRUE, GL_TRUE } });
630
EXPECT_EQ(GL_TRUE, u.get()[0]);
631
EXPECT_EQ(GL_TRUE, u.get()[1]);
632
u.set({ { GL_FALSE, GL_FALSE } });
633
EXPECT_EQ(GL_FALSE, u.get()[0]);
634
EXPECT_EQ(GL_FALSE, u.get()[1]);
636
u.set(true, false); // Separate parameter interface
639
EXPECT_EQ(GL_TRUE, x);
640
EXPECT_EQ(GL_FALSE, y);
642
assign_test<BoolVec2>(u);
646
UniformVariable& uv = p->uniform("bv3");
647
BoolVec3Uniform& u = dynamic_cast<BoolVec3Uniform&>(uv);
648
u.set({ { GL_TRUE, GL_TRUE , GL_TRUE } });
649
EXPECT_EQ(GL_TRUE, u.get()[0]);
650
EXPECT_EQ(GL_TRUE, u.get()[1]);
651
EXPECT_EQ(GL_TRUE, u.get()[2]);
652
u.set({ { GL_FALSE, GL_FALSE , GL_FALSE } });
653
EXPECT_EQ(GL_FALSE, u.get()[0]);
654
EXPECT_EQ(GL_FALSE, u.get()[1]);
655
EXPECT_EQ(GL_FALSE, u.get()[2]);
657
u.set(true, false, true); // Separate parameter interface
660
EXPECT_EQ(GL_TRUE, x);
661
EXPECT_EQ(GL_FALSE, y);
662
EXPECT_EQ(GL_TRUE, z);
664
assign_test<BoolVec3>(u);
668
UniformVariable& uv = p->uniform("bv4");
669
BoolVec4Uniform& u = dynamic_cast<BoolVec4Uniform&>(uv);
670
u.set({ { GL_TRUE, GL_TRUE , GL_TRUE, GL_TRUE } });
671
EXPECT_EQ(GL_TRUE, u.get()[0]);
672
EXPECT_EQ(GL_TRUE, u.get()[1]);
673
EXPECT_EQ(GL_TRUE, u.get()[2]);
674
EXPECT_EQ(GL_TRUE, u.get()[3]);
675
u.set({ { GL_FALSE, GL_FALSE , GL_FALSE, GL_FALSE } });
676
EXPECT_EQ(GL_FALSE, u.get()[0]);
677
EXPECT_EQ(GL_FALSE, u.get()[1]);
678
EXPECT_EQ(GL_FALSE, u.get()[2]);
679
EXPECT_EQ(GL_FALSE, u.get()[3]);
681
u.set(true, false, true, true); // Separate parameter interface
682
GLboolean x, y, z, w;
684
EXPECT_EQ(GL_TRUE, x);
685
EXPECT_EQ(GL_FALSE, y);
686
EXPECT_EQ(GL_TRUE, z);
687
EXPECT_EQ(GL_TRUE, w);
689
assign_test<BoolVec4>(u);
695
UniformVariable& uv = p->uniform("ba");
696
BoolArrayUniform& u = dynamic_cast<BoolArrayUniform&>(uv);
697
u.set({ { GL_FALSE, GL_TRUE } });
698
EXPECT_EQ(GL_FALSE, u.get()[0]);
699
EXPECT_EQ(GL_TRUE, u.get()[1]);
700
u.set({ { GL_TRUE, GL_FALSE } });
701
EXPECT_EQ(GL_TRUE, u.get()[0]);
702
EXPECT_EQ(GL_FALSE, u.get()[1]);
704
assign_test<BoolArray>(u);
705
size_test<GLboolean>(u);
709
UniformVariable& uv = p->uniform("bv2a");
710
BoolVec2ArrayUniform& u = dynamic_cast<BoolVec2ArrayUniform&>(uv);
712
{ { GL_FALSE, GL_FALSE } },
713
{ { GL_FALSE, GL_FALSE } }
716
EXPECT_EQ(a, u.get());
719
{ { GL_TRUE, GL_TRUE } },
720
{ { GL_TRUE, GL_TRUE } }
723
EXPECT_EQ(a, u.get());
725
assign_test<BoolVec2Array>(u);
726
size_test<BoolVec2>(u);
730
UniformVariable& uv = p->uniform("bv3a");
731
BoolVec3ArrayUniform& u = dynamic_cast<BoolVec3ArrayUniform&>(uv);
733
{ { GL_FALSE, GL_FALSE, GL_FALSE } },
734
{ { GL_FALSE, GL_FALSE, GL_FALSE } }
737
EXPECT_EQ(a, u.get());
740
{ { GL_TRUE, GL_TRUE, GL_TRUE } },
741
{ { GL_TRUE, GL_TRUE, GL_TRUE } }
744
EXPECT_EQ(a, u.get());
746
assign_test<BoolVec3Array>(u);
747
size_test<BoolVec3>(u);
751
UniformVariable& uv = p->uniform("bv4a");
752
BoolVec4ArrayUniform& u = dynamic_cast<BoolVec4ArrayUniform&>(uv);
754
{ { GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE } },
755
{ { GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE } }
758
EXPECT_EQ(a, u.get());
761
{ { GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE } },
762
{ { GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE } }
765
EXPECT_EQ(a, u.get());
767
assign_test<BoolVec4Array>(u);
768
size_test<BoolVec4>(u);
774
UniformVariable& uv = p->uniform("s");
775
Sampler2DUniform& u = dynamic_cast<Sampler2DUniform&>(uv);
777
EXPECT_EQ(0, u.get());
779
assign_test<GLint>(u);
785
UniformVariable& uv = p->uniform("sa");
786
Sampler2DArrayUniform& u = dynamic_cast<Sampler2DArrayUniform&>(uv);
788
EXPECT_EQ(1, u.get()[0]);
789
EXPECT_EQ(2, u.get()[1]);
791
assign_test<Sampler2DArray>(u);
798
UniformVariable& uv = p->uniform("c");
799
SamplerCubeUniform& u = dynamic_cast<SamplerCubeUniform&>(uv);
801
EXPECT_EQ(0, u.get());
803
assign_test<GLint>(u);
809
UniformVariable& uv = p->uniform("ca");
810
SamplerCubeArrayUniform& u = dynamic_cast<SamplerCubeArrayUniform&>(uv);
812
EXPECT_EQ(1, u.get()[0]);
813
EXPECT_EQ(2, u.get()[1]);
815
assign_test<SamplerCubeArray>(u);
819
catch (const Exception& e)
821
FAIL() << e.to_string();