@@ -43,55 +43,59 @@ frame_buffer::frame_buffer(
43
43
std::move(stencil)
44
44
)
45
45
{
46
- glGenFramebuffers (1 , &this ->fbo );
47
- assert_opengl_no_error ();
46
+ // In OpenGL framebuffer objects are not shared between contexts,
47
+ // so make sure the owning context is bound when deleting the framebuffer object.
48
+ this ->rendering_context .get ().apply ([this ]() {
49
+ glGenFramebuffers (1 , &this ->fbo );
50
+ assert_opengl_no_error ();
48
51
49
- // No need to initialize the variable because it is initialized via
50
- // output argument of glGetIntegerv().
51
- // NOLINTNEXTLINE(cppcoreguidelines-init-variables)
52
- GLint old_fb;
53
- glGetIntegerv (GL_FRAMEBUFFER_BINDING, &old_fb);
52
+ // No need to initialize the variable because it is initialized via
53
+ // output argument of glGetIntegerv().
54
+ // NOLINTNEXTLINE(cppcoreguidelines-init-variables)
55
+ GLint old_fb;
56
+ glGetIntegerv (GL_FRAMEBUFFER_BINDING, &old_fb);
54
57
55
- glBindFramebuffer (GL_FRAMEBUFFER, this ->fbo );
56
- assert_opengl_no_error ();
58
+ glBindFramebuffer (GL_FRAMEBUFFER, this ->fbo );
59
+ assert_opengl_no_error ();
57
60
58
- if (this ->color ) {
59
- ASSERT (dynamic_cast <texture_2d*>(this ->color .get ()))
60
- // NOLINTNEXTLINE(cppcoreguidelines-pro-type-static-cast-downcast)
61
- auto & tex = static_cast <texture_2d&>(*this ->color );
61
+ if (this ->color ) {
62
+ ASSERT (dynamic_cast <texture_2d*>(this ->color .get ()))
63
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-static-cast-downcast)
64
+ auto & tex = static_cast <texture_2d&>(*this ->color );
62
65
63
- glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex.tex , 0 );
64
- assert_opengl_no_error ();
65
- } else {
66
- // TODO: glDrawBuffer(GL_NONE) ? See https://gamedev.stackexchange.com/a/152047
67
- }
66
+ glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex.tex , 0 );
67
+ assert_opengl_no_error ();
68
+ } else {
69
+ // TODO: glDrawBuffer(GL_NONE) ? See https://gamedev.stackexchange.com/a/152047
70
+ }
68
71
69
- if (this ->depth ) {
70
- ASSERT (dynamic_cast <texture_depth*>(this ->depth .get ()))
71
- // NOLINTNEXTLINE(cppcoreguidelines-pro-type-static-cast-downcast)
72
- auto & tex = static_cast <texture_depth&>(*this ->depth );
72
+ if (this ->depth ) {
73
+ ASSERT (dynamic_cast <texture_depth*>(this ->depth .get ()))
74
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-static-cast-downcast)
75
+ auto & tex = static_cast <texture_depth&>(*this ->depth );
73
76
74
- glFramebufferTexture2D (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, tex.tex , 0 );
75
- assert_opengl_no_error ();
76
- }
77
+ glFramebufferTexture2D (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, tex.tex , 0 );
78
+ assert_opengl_no_error ();
79
+ }
77
80
78
- if (this ->stencil ) {
79
- throw std::logic_error (" frame_buffer(): OpenGL stencil texture support is not implemented" );
80
- }
81
+ if (this ->stencil ) {
82
+ throw std::logic_error (" frame_buffer(): OpenGL stencil texture support is not implemented" );
83
+ }
81
84
82
- // check for completeness
83
- {
84
- GLenum status = glCheckFramebufferStatus (GL_FRAMEBUFFER);
85
- assert_opengl_no_error ();
86
- if (status != GL_FRAMEBUFFER_COMPLETE) {
87
- throw std::runtime_error (
88
- utki::cat (" frame_buffer(): OpenGL framebuffer is incomplete: status = " , unsigned (status))
89
- );
85
+ // check for completeness
86
+ {
87
+ GLenum status = glCheckFramebufferStatus (GL_FRAMEBUFFER);
88
+ assert_opengl_no_error ();
89
+ if (status != GL_FRAMEBUFFER_COMPLETE) {
90
+ throw std::runtime_error (
91
+ utki::cat (" frame_buffer(): OpenGL framebuffer is incomplete: status = " , unsigned (status))
92
+ );
93
+ }
90
94
}
91
- }
92
95
93
- glBindFramebuffer (GL_FRAMEBUFFER, old_fb);
94
- assert_opengl_no_error ();
96
+ glBindFramebuffer (GL_FRAMEBUFFER, old_fb);
97
+ assert_opengl_no_error ();
98
+ });
95
99
}
96
100
97
101
frame_buffer::~frame_buffer ()
0 commit comments