]> git.tdb.fi Git - libs/gl.git/blob - source/glsl/features.cpp
Clear load ID when assigning to a component
[libs/gl.git] / source / glsl / features.cpp
1 #include <stdexcept>
2 #include "features.h"
3
4 using namespace std;
5
6 namespace Msp {
7 namespace GL {
8 namespace SL {
9
10 Features Features::from_api_version(GraphicsApi api, const Version &ver)
11 {
12         Features features;
13         features.target_api = api;
14         features.glsl_version = ver;
15         switch(api)
16         {
17         case OPENGL:
18                 if(ver.major==2)
19                         features.glsl_version = Version(1, (ver.minor+1)*10);
20                 else if(ver.major==3 && ver.minor<3)
21                         features.glsl_version = Version(1, (ver.minor+3)*10);
22                 else
23                         features.glsl_version = Version(ver.major, ver.minor*10);
24
25                 features.arb_enhanced_layouts = (ver>=Version(4, 4));
26                 features.arb_explicit_attrib_location = (ver>=Version(3, 3));
27                 features.arb_explicit_uniform_location = (ver>=Version(4, 3));
28                 features.arb_gpu_shader5 = (ver>=Version(4, 0));
29                 features.arb_separate_shader_objects = (ver>=Version(4, 1));
30                 features.arb_uniform_buffer_object = (ver>=Version(3, 2));
31                 features.ext_gpu_shader4 = (ver>=Version(2, 1));
32                 features.ext_texture_array = (ver>=Version(3, 0));
33                 features.uniform_binding_range = (ver>=Version(4, 3) ? 84 : ver>=Version(4, 0) ? 60 :
34                         ver>=Version(3, 3) ? 36 : 24);
35                 features.texture_binding_range = (ver>=Version(4, 3) ? 96 : ver>=Version(4, 0) ? 80 :
36                         ver>=Version(3, 2) ? 48 : ver>=Version(1, 4) ? 32 : 16);
37                 features.storage_texture_binding_range = 8;
38                 break;
39         case OPENGL_ES:
40                 if(ver.major==2)
41                         features.glsl_version = Version(1, 0);
42                 else
43                         features.glsl_version = Version(ver.major, ver.minor*10);
44
45                 features.arb_enhanced_layouts = (ver>=Version(3, 2));
46                 features.arb_explicit_attrib_location = (ver>=Version(3, 0));
47                 features.arb_explicit_uniform_location = (ver>=Version(3, 1));
48                 features.arb_gpu_shader5 = (ver>=Version(3, 2));
49                 features.arb_separate_shader_objects = (ver>=Version(3, 1));
50                 features.arb_uniform_buffer_object = (ver>=Version(3, 0));
51                 features.ext_gpu_shader4 = (ver>=Version(3, 0));
52                 features.ext_texture_array = (ver>=Version(3, 0));
53                 features.uniform_binding_range = (ver>=Version(3, 2) ? 72 : ver>=Version(3, 1) ? 36 : 24);
54                 features.texture_binding_range = (ver>=Version(3, 2) ? 96 : ver>=Version(3, 1) ? 48 :
55                         ver>=Version(3, 0) ? 32 : 8);
56                 features.storage_texture_binding_range = 4;
57                 break;
58         case VULKAN:
59                 features.glsl_version = Version(4, 60);
60                 features.uniform_binding_range = 72;
61                 features.texture_binding_range = 96;
62                 features.storage_texture_binding_range = 24;
63                 break;
64         default:
65                 throw invalid_argument("Features::from_api_version");
66         }
67         return features;
68 }
69
70 Features Features::latest(GraphicsApi api)
71 {
72         switch(api)
73         {
74         case OPENGL:
75                 return from_api_version(api, Version(4, 6));
76         case OPENGL_ES:
77                 return from_api_version(api, Version(3, 2));
78         case VULKAN:
79                 return from_api_version(api, Version(1, 2));
80         default:
81                 throw invalid_argument("Features::latest");
82         }
83 }
84
85 } // namespace SL
86 } // namespace GL
87 } // namespace Msp