1 module gfx.gl3.context; 2 3 import gfx.bindings.opengl.gl : Gl; 4 import gfx.core.rc : IAtomicRefCounted; 5 import gfx.graal.format : Format; 6 7 enum GlProfile 8 { 9 core, 10 compatibility 11 } 12 13 struct GlAttribs 14 { 15 enum profile = GlProfile.core; 16 enum doublebuffer = true; 17 18 uint majorVersion = 3; 19 uint minorVersion = 1; 20 21 uint samples = 1; 22 23 @property Format colorFormat() const pure { 24 return _colorFormat; 25 } 26 @property Format depthStencilFormat() const pure { 27 return _depthStencilFormat; 28 } 29 30 private Format _colorFormat = Format.rgba8_uNorm; 31 private Format _depthStencilFormat = Format.d24s8_uNorm; 32 33 @property uint decimalVersion() const pure { 34 return majorVersion * 10 + minorVersion; 35 } 36 } 37 38 /// The list of OpenGL versions that gfx-d is compatible with. 39 immutable uint[] glVersions = [ 40 46, 45, 44, 43, 42, 41, 40, 41 33, 32, 31, // 30 42 // 21, 20, 43 // 15, 14, 13, 12, 11, 10, 44 ]; 45 46 /// The GLSL version for the passed OpenGL version. 47 uint glslVersion(in uint glVersion) pure { 48 if (glVersion >= 33) return 10*glVersion; 49 switch(glVersion) { 50 case 32: return 150; 51 case 31: return 140; 52 case 30: return 130; 53 case 21: return 120; 54 case 20: return 110; 55 default: assert(false); 56 } 57 } 58 59 interface GlContext : IAtomicRefCounted 60 { 61 @property Gl gl(); 62 63 @property GlAttribs attribs(); 64 65 bool makeCurrent(size_t nativeHandle); 66 67 void doneCurrent(); 68 69 @property bool current(); 70 71 @property int swapInterval() 72 in { assert(current); } 73 74 @property void swapInterval(int interval) 75 in { assert(current); } 76 77 void swapBuffers(size_t nativeHandle) 78 in { assert(current); } 79 } 80 81 immutable string[] glRequiredExtensions = [ 82 "GL_ARB_framebuffer_object" 83 ]; 84 immutable string[] glOptionalExtensions = [ 85 "GL_ARB_buffer_storage", 86 "GL_ARB_texture_storage", 87 "GL_ARB_texture_storage_multisample", 88 "GL_ARB_sampler_object", 89 "ARB_draw_elements_base_vertex", 90 "ARB_base_instance", 91 "ARB_viewport_array", 92 "GL_EXT_polygon_offset_clamp", 93 ]; 94 95 string[] glAvailableExtensions(Gl gl) 96 { 97 import gfx.bindings.opengl.gl : GLint, GL_EXTENSIONS, GL_NUM_EXTENSIONS; 98 99 GLint num; 100 gl.GetIntegerv(GL_NUM_EXTENSIONS, &num); 101 string[] exts; 102 foreach (i; 0 .. num) 103 { 104 import std..string : fromStringz; 105 auto cStr = cast(const(char)*)gl.GetStringi(GL_EXTENSIONS, i); 106 exts ~= fromStringz(cStr).idup; 107 } 108 return exts; 109 }