Merge branch 'mesa_7_5_branch'
[mesa.git] / src / gallium / state_trackers / egl / egl_surface.c
index 091d437d81b8ecbc09d4574282d0aa81a16a6fe5..d4cd2d3c743e442432494deb92bf1b89e462d3b9 100644 (file)
  * Util functions
  */
 
-static struct drm_mode_modeinfo *
+static drmModeModeInfoPtr
 drm_find_mode(drmModeConnectorPtr connector, _EGLMode *mode)
 {
        int i;
-       struct drm_mode_modeinfo *m = NULL;
+       drmModeModeInfoPtr m = NULL;
 
        for (i = 0; i < connector->count_modes; i++) {
                m = &connector->modes[i];
@@ -98,8 +98,8 @@ drm_create_texture(_EGLDriver *drv,
                goto err_buf;
 
        memset(&templat, 0, sizeof(templat));
-       templat.tex_usage |= PIPE_TEXTURE_USAGE_DISPLAY_TARGET;
-       templat.tex_usage |= PIPE_TEXTURE_USAGE_RENDER_TARGET;
+       templat.tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET;
+       templat.tex_usage |= PIPE_TEXTURE_USAGE_PRIMARY;
        templat.target = PIPE_TEXTURE_2D;
        templat.last_level = 0;
        templat.depth[0] = 1;
@@ -132,7 +132,7 @@ drm_create_texture(_EGLDriver *drv,
        scrn->front.width = w;
        scrn->front.height = h;
        scrn->front.pitch = pitch;
-       scrn->front.handle = drm_api_hocks.handle_from_buffer(dev->winsys, scrn->buffer);
+       dev->api->handle_from_buffer(dev->api, screen, scrn->buffer, &scrn->front.handle);
        if (0)
                goto err_handle;
 
@@ -143,7 +143,7 @@ err_handle:
 err_surf:
        pipe_texture_reference(&texture, NULL);
 err_tex:
-       pipe_buffer_reference(screen, &buf, NULL);
+       pipe_buffer_reference(&buf, NULL);
 err_buf:
        return;
 }
@@ -173,7 +173,7 @@ drm_takedown_shown_screen(_EGLDriver *drv, struct drm_screen *screen)
 
        pipe_surface_reference(&screen->surface, NULL);
        pipe_texture_reference(&screen->tex, NULL);
-       pipe_buffer_reference(dev->screen, &screen->buffer, NULL);
+       pipe_buffer_reference(&screen->buffer, NULL);
 
        screen->shown = 0;
 }
@@ -232,7 +232,7 @@ drm_create_pbuffer_surface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config,
        if (!surf)
                goto err;
 
-       if (!_eglInitSurface(drv, dpy, &surf->base, EGL_PBUFFER_BIT, config, attrib_list))
+       if (!_eglInitSurface(drv, &surf->base, EGL_PBUFFER_BIT, conf, attrib_list))
                goto err_surf;
 
        surf->w = width;
@@ -245,7 +245,7 @@ drm_create_pbuffer_surface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config,
                                            (void*)surf);
        drm_visual_modes_destroy(visual);
 
-       _eglSaveSurface(&surf->base);
+        _eglLinkSurface(&surf->base, _eglLookupDisplay(dpy));
        return surf->base.Handle;
 
 err_surf:
@@ -271,7 +271,6 @@ drm_show_screen_surface_mesa(_EGLDriver *drv, EGLDisplay dpy,
        struct drm_device *dev = (struct drm_device *)drv;
        struct drm_surface *surf = lookup_drm_surface(surface);
        struct drm_screen *scrn = lookup_drm_screen(dpy, screen);
-       struct pipe_context *pipe;
        _EGLMode *mode = _eglLookupMode(dpy, m);
        int ret;
        unsigned int i, k;
@@ -331,6 +330,13 @@ drm_show_screen_surface_mesa(_EGLDriver *drv, EGLDisplay dpy,
        if (ret)
                goto err_crtc;
 
+
+       if (scrn->dpms)
+               drmModeConnectorSetProperty(dev->drmFD,
+                                           scrn->connectorID,
+                                           scrn->dpms->prop_id,
+                                           DRM_MODE_DPMS_ON);
+
        surf->screen = scrn;
 
        scrn->surf = surf;
@@ -349,7 +355,7 @@ err_fb:
 err_bo:
        pipe_surface_reference(&scrn->surface, NULL);
        pipe_texture_reference(&scrn->tex, NULL);
-       pipe_buffer_reference(dev->screen, &scrn->buffer, NULL);
+       pipe_buffer_reference(&scrn->buffer, NULL);
 
        return EGL_FALSE;
 }
@@ -358,10 +364,9 @@ EGLBoolean
 drm_destroy_surface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
 {
        struct drm_surface *surf = lookup_drm_surface(surface);
-       _eglRemoveSurface(&surf->base);
-       if (surf->base.IsBound) {
-               surf->base.DeletePending = EGL_TRUE;
-       } else {
+       _eglUnlinkSurface(&surf->base);
+
+       if (!_eglIsSurfaceBound(&surf->base)) {
                if (surf->screen)
                        drm_takedown_shown_screen(drv, surf->screen);
                st_unreference_framebuffer(surf->stfb);
@@ -392,7 +397,6 @@ drm_swap_buffers(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw)
                if (surf->screen) {
                        surf->user->pipe->flush(surf->user->pipe, PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_TEXTURE_CACHE, NULL);
                        surf->user->pipe->surface_copy(surf->user->pipe,
-                               0,
                                surf->screen->surface,
                                0, 0,
                                back_surf,
@@ -401,8 +405,6 @@ drm_swap_buffers(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw)
                        surf->user->pipe->flush(surf->user->pipe, PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_TEXTURE_CACHE, NULL);
                        /* TODO stuff here */
                }
-
-               st_notify_swapbuffers_complete(surf->stfb);
        }
 
        return EGL_TRUE;