|
|
@@ -37,7 +37,11 @@ osxGraphicsBuffer(GraphicsEngine *engine, GraphicsPipe *pipe,
|
|
|
{
|
|
|
osxGraphicsPipe *osx_pipe;
|
|
|
DCAST_INTO_V(osx_pipe, _pipe);
|
|
|
+
|
|
|
+ _pbuffer = NULL;
|
|
|
|
|
|
+ // Since the pbuffer never gets flipped, we get screenshots from the
|
|
|
+ // same buffer we draw into.
|
|
|
_screenshot_buffer_type = _draw_buffer_type;
|
|
|
}
|
|
|
|
|
|
@@ -48,6 +52,7 @@ osxGraphicsBuffer(GraphicsEngine *engine, GraphicsPipe *pipe,
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
osxGraphicsBuffer::
|
|
|
~osxGraphicsBuffer() {
|
|
|
+ nassertv(_pbuffer == NULL);
|
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
@@ -67,15 +72,23 @@ begin_frame(FrameMode mode, Thread *current_thread) {
|
|
|
if (_gsg == (GraphicsStateGuardian *)NULL) {
|
|
|
return false;
|
|
|
}
|
|
|
+ nassertr(_pbuffer != NULL, false);
|
|
|
|
|
|
osxGraphicsStateGuardian *osxgsg;
|
|
|
DCAST_INTO_R(osxgsg, _gsg, false);
|
|
|
-// osxMakeCurrent(_display, _pbuffer, osxgsg->_context);
|
|
|
+ if (!aglSetPBuffer(osxgsg->get_context(), _pbuffer, 0, 0, 0)) {
|
|
|
+ aglReportError("aglSetPBuffer");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!aglSetCurrentContext(osxgsg->get_context())) {
|
|
|
+ aglReportError("aglSetCurrentContext");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
|
|
|
osxgsg->reset_if_new();
|
|
|
|
|
|
- if (mode == FM_render)
|
|
|
- {
|
|
|
+ if (mode == FM_render) {
|
|
|
for (int i=0; i<count_textures(); i++) {
|
|
|
if (get_rtm_mode(i) == RTM_bind_or_copy) {
|
|
|
_textures[i]._rtm_mode = RTM_copy_texture;
|
|
|
@@ -99,8 +112,7 @@ end_frame(FrameMode mode, Thread *current_thread) {
|
|
|
end_frame_spam(mode);
|
|
|
nassertv(_gsg != (GraphicsStateGuardian *)NULL);
|
|
|
|
|
|
- if (mode == FM_render)
|
|
|
- {
|
|
|
+ if (mode == FM_render) {
|
|
|
copy_to_textures();
|
|
|
}
|
|
|
|
|
|
@@ -124,10 +136,14 @@ end_frame(FrameMode mode, Thread *current_thread) {
|
|
|
void osxGraphicsBuffer::
|
|
|
close_buffer() {
|
|
|
if (_gsg != (GraphicsStateGuardian *)NULL) {
|
|
|
- //osxMakeCurrent(_display, None, NULL);
|
|
|
+ // aglSetPBuffer(osxgsg->get_context(), _pbuffer, 0, 0, 0);
|
|
|
_gsg.clear();
|
|
|
_active = false;
|
|
|
}
|
|
|
+ if (_pbuffer != NULL) {
|
|
|
+ aglDestroyPBuffer(_pbuffer);
|
|
|
+ _pbuffer = NULL;
|
|
|
+ }
|
|
|
_is_valid = false;
|
|
|
}
|
|
|
|
|
|
@@ -140,11 +156,52 @@ close_buffer() {
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
bool osxGraphicsBuffer::
|
|
|
open_buffer() {
|
|
|
-
|
|
|
if (_gsg == 0) {
|
|
|
_gsg = new osxGraphicsStateGuardian(_engine, _pipe, NULL);
|
|
|
}
|
|
|
+
|
|
|
+ if (_pbuffer == NULL) {
|
|
|
+ if (!aglCreatePBuffer(_x_size, _y_size, GL_TEXTURE_2D, GL_RGBA, 0, &_pbuffer)) {
|
|
|
+ aglReportError("aglCreatePBuffer");
|
|
|
+ close_buffer();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ osxGraphicsStateGuardian *osxgsg;
|
|
|
+ DCAST_INTO_R(osxgsg, _gsg, false);
|
|
|
+ OSStatus stat = osxgsg->buildGL(false, true, _fb_properties);
|
|
|
+ if (stat != noErr) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!aglSetPBuffer(osxgsg->get_context(), _pbuffer, 0, 0, 0)) {
|
|
|
+ aglReportError("aglSetPBuffer");
|
|
|
+ close_buffer();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!aglSetCurrentContext(osxgsg->get_context())) {
|
|
|
+ aglReportError("aglSetCurrentContext");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ osxgsg->reset_if_new();
|
|
|
+ if (!osxgsg->is_valid()) {
|
|
|
+ close_buffer();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ if (!osxgsg->get_fb_properties().verify_hardware_software
|
|
|
+ (_fb_properties, osxgsg->get_gl_renderer())) {
|
|
|
+ close_buffer();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ _fb_properties = osxgsg->get_fb_properties();
|
|
|
+ */
|
|
|
|
|
|
- return false;
|
|
|
+ _is_valid = true;
|
|
|
+ return true;
|
|
|
}
|
|
|
|