29 const std::string &name,
35 GraphicsBuffer(engine, pipe, name, fb_prop, win_prop, flags, gsg, host)
38 DCAST_INTO_V(egl_pipe, _pipe);
39 _pbuffer = EGL_NO_SURFACE;
43 _screenshot_buffer_type = _draw_buffer_type;
50 ~eglGraphicsBuffer() {
51 nassertv(_pbuffer == EGL_NO_SURFACE);
62 PStatTimer timer(_make_current_pcollector, current_thread);
64 begin_frame_spam(mode);
65 if (_gsg ==
nullptr) {
70 DCAST_INTO_R(eglgsg, _gsg,
false);
71 if (!eglMakeCurrent(eglgsg->_egl_display, _pbuffer, _pbuffer, eglgsg->_context)) {
72 egldisplay_cat.error() <<
"Failed to call eglMakeCurrent: "
80 eglgsg->reset_if_new();
82 if (mode == FM_render) {
84 for (
size_t i = 0; i != cdata->_textures.size(); ++i) {
85 const RenderTexture &rt = cdata->_textures[i];
86 RenderTextureMode rtm_mode = rt._rtm_mode;
87 if (rtm_mode == RTM_bind_or_copy) {
88 CDWriter cdataw(_cycler, cdata,
false);
89 nassertr(cdata->_textures.size() == cdataw->_textures.size(),
false);
90 cdataw->_textures[i]._rtm_mode = RTM_copy_texture;
93 clear_cube_map_selection();
97 return _gsg->begin_frame(current_thread);
107 end_frame_spam(mode);
108 nassertv(_gsg !=
nullptr);
110 if (mode == FM_render) {
114 _gsg->end_frame(current_thread);
116 if (mode == FM_render) {
118 clear_cube_map_selection();
125 void eglGraphicsBuffer::
127 if (_gsg !=
nullptr) {
129 DCAST_INTO_V(eglgsg, _gsg);
130 if (!eglMakeCurrent(eglgsg->_egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)) {
131 egldisplay_cat.error() <<
"Failed to call eglMakeCurrent: "
136 if (_pbuffer != EGL_NO_SURFACE) {
137 if (!eglDestroySurface(_egl_display, _pbuffer)) {
138 egldisplay_cat.error() <<
"Failed to destroy surface: "
141 _pbuffer = EGL_NO_SURFACE;
152 bool eglGraphicsBuffer::
155 DCAST_INTO_R(egl_pipe, _pipe,
false);
167 DCAST_INTO_R(eglgsg, _gsg,
false);
175 if (eglgsg->_fbconfig == None) {
181 int attrib_list[] = {
182 EGL_WIDTH, _size.get_x(),
183 EGL_HEIGHT, _size.get_y(),
187 _pbuffer = eglCreatePbufferSurface(eglgsg->_egl_display, eglgsg->_fbconfig, attrib_list);
189 if (_pbuffer == EGL_NO_SURFACE) {
190 egldisplay_cat.error()
191 <<
"Failed to create EGL pbuffer surface: "
196 if (!eglMakeCurrent(eglgsg->_egl_display, _pbuffer, _pbuffer, eglgsg->_context)) {
197 egldisplay_cat.error() <<
"Failed to call eglMakeCurrent: "
200 eglgsg->reset_if_new();
201 if (!eglgsg->is_valid()) {
206 (_fb_properties, eglgsg->get_gl_renderer())) {