struct pipe_screen * rbug_screen_create(struct pipe_screen *screen) { struct rbug_screen *rb_screen; if (!debug_get_option_rbug()) return screen; rb_screen = CALLOC_STRUCT(rbug_screen); if (!rb_screen) return screen; pipe_mutex_init(rb_screen->list_mutex); make_empty_list(&rb_screen->contexts); make_empty_list(&rb_screen->resources); make_empty_list(&rb_screen->surfaces); make_empty_list(&rb_screen->transfers); rb_screen->base.winsys = NULL; rb_screen->base.destroy = rbug_screen_destroy; rb_screen->base.get_name = rbug_screen_get_name; rb_screen->base.get_vendor = rbug_screen_get_vendor; rb_screen->base.get_param = rbug_screen_get_param; rb_screen->base.get_shader_param = rbug_screen_get_shader_param; rb_screen->base.get_paramf = rbug_screen_get_paramf; rb_screen->base.is_format_supported = rbug_screen_is_format_supported; rb_screen->base.context_create = rbug_screen_context_create; rb_screen->base.resource_create = rbug_screen_resource_create; rb_screen->base.resource_from_handle = rbug_screen_resource_from_handle; rb_screen->base.resource_get_handle = rbug_screen_resource_get_handle; rb_screen->base.resource_destroy = rbug_screen_resource_destroy; rb_screen->base.user_buffer_create = rbug_screen_user_buffer_create; rb_screen->base.flush_frontbuffer = rbug_screen_flush_frontbuffer; rb_screen->base.fence_reference = rbug_screen_fence_reference; rb_screen->base.fence_signalled = rbug_screen_fence_signalled; rb_screen->base.fence_finish = rbug_screen_fence_finish; rb_screen->screen = screen; rb_screen->private_context = screen->context_create(screen, NULL); if (!rb_screen->private_context) goto err_free; rb_screen->rbug = rbug_start(rb_screen); if (!rb_screen->rbug) goto err_context; return &rb_screen->base; err_context: rb_screen->private_context->destroy(rb_screen->private_context); err_free: FREE(rb_screen); return screen; }
boolean rbug_enabled() { return debug_get_option_rbug(); }