void rut_camera_suspend (RutCamera *camera) { CameraFlushState *state; /* There's not point suspending a frame that hasn't been flushed */ g_return_if_fail (camera->in_frame == TRUE); g_return_if_fail (camera->suspended == FALSE); state = cogl_object_get_user_data (COGL_OBJECT (camera->fb), &fb_camera_key); /* We only expect to be saving a camera that has been flushed */ g_return_if_fail (state != NULL); /* While the camera is in a suspended state we aren't expecting the * camera to be touched but we want to double check that at least * the transform hasn't been touched when we come to resume the * camera... */ camera->at_suspend_transform_age = camera->transform_age; /* When we resume the camer we'll need to restore the modelview, * projection and viewport transforms. The easiest way for us to * handle restoring the modelview is to use the framebuffer's * matrix stack... */ cogl_framebuffer_push_matrix (camera->fb); camera->suspended = TRUE; camera->in_frame = FALSE; }
CoglXlibRenderer * _cogl_xlib_renderer_get_data (CoglRenderer *renderer) { static CoglUserDataKey key; CoglXlibRenderer *data; /* Constructs a CoglXlibRenderer struct on demand and attaches it to the object using user data. It's done this way instead of using a subclassing hierarchy in the winsys data because all EGL winsys's need the EGL winsys data but only one of them wants the Xlib data. */ data = cogl_object_get_user_data (COGL_OBJECT (renderer), &key); if (data == NULL) { data = g_slice_new0 (CoglXlibRenderer); cogl_object_set_user_data (COGL_OBJECT (renderer), &key, data, destroy_xlib_renderer_data); } return data; }
static void _rut_camera_flush_transforms (RutCamera *camera) { const CoglMatrix *projection; CoglFramebuffer *fb = camera->fb; CameraFlushState *state; /* While a camera is in a suspended state then we don't expect to * _flush() and use that camera before it is restored. */ g_return_if_fail (camera->suspended == FALSE); state = cogl_object_get_user_data (COGL_OBJECT (fb), &fb_camera_key); if (!state) { state = g_slice_new (CameraFlushState); cogl_object_set_user_data (COGL_OBJECT (fb), &fb_camera_key, state, free_camera_flush_state); } else if (state->current_camera == camera && camera->transform_age == state->transform_age) goto done; if (camera->in_frame) { g_warning ("Un-balanced rut_camera_flush/_end calls: " "repeat _flush() calls before _end()"); } cogl_framebuffer_set_viewport (fb, camera->viewport[0], camera->viewport[1], camera->viewport[2], camera->viewport[3]); projection = rut_camera_get_projection (camera); cogl_framebuffer_set_projection_matrix (fb, projection); cogl_framebuffer_set_modelview_matrix (fb, &camera->view); state->current_camera = camera; state->transform_age = camera->transform_age; done: camera->in_frame = TRUE; }
void rut_camera_resume (RutCamera *camera) { CameraFlushState *state; CoglFramebuffer *fb = camera->fb; g_return_if_fail (camera->in_frame == FALSE); g_return_if_fail (camera->suspended == TRUE); /* While a camera is in a suspended state we don't expect the camera * to be touched so its transforms shouldn't have changed... */ g_return_if_fail (camera->at_suspend_transform_age == camera->transform_age); state = cogl_object_get_user_data (COGL_OBJECT (fb), &fb_camera_key); /* We only expect to be restoring a camera that has been flushed * before */ g_return_if_fail (state != NULL); cogl_framebuffer_pop_matrix (fb); /* If the save turned out to be redundant then we have nothing * else to restore... */ if (state->current_camera == camera) goto done; cogl_framebuffer_set_viewport (fb, camera->viewport[0], camera->viewport[1], camera->viewport[2], camera->viewport[3]); cogl_framebuffer_set_projection_matrix (fb, &camera->projection); state->current_camera = camera; state->transform_age = camera->transform_age; done: camera->in_frame = TRUE; camera->suspended = FALSE; }
static CoglPipelineShaderState * get_shader_state (CoglPipeline *pipeline) { return cogl_object_get_user_data (COGL_OBJECT (pipeline), &shader_state_key); }
static CoglPipelineVertendPrivate * get_glsl_priv (CoglPipeline *pipeline) { return cogl_object_get_user_data (COGL_OBJECT (pipeline), &glsl_priv_key); }