st/egl: overload NATIVE_PARAM_PREMULTIPLIED_ALPHA
[mesa.git] / src / gallium / state_trackers / egl / gdi / native_gdi.c
index 56f190de00248ee9df0f5c628cf36a7349148bb8..d3fec719a21fadf91a815a32f1d18a041911c2e4 100644 (file)
@@ -41,7 +41,7 @@ struct gdi_display {
    struct native_display base;
 
    HDC hDC;
-   struct native_event_handler *event_handler;
+   const struct native_event_handler *event_handler;
 
    struct native_config *configs;
    int num_configs;
@@ -159,6 +159,30 @@ gdi_surface_swap_buffers(struct native_surface *nsurf)
    return ret;
 }
 
+static boolean
+gdi_surface_present(struct native_surface *nsurf,
+                    const native_present_control *ctrl)
+{
+   boolean ret;
+
+   if (ctrl->preserve || ctrl->swap_interval)
+      return FALSE;
+
+   switch (ctrl->natt) {
+   case NATIVE_ATTACHMENT_FRONT_LEFT:
+      ret = gdi_surface_flush_frontbuffer(nsurf);
+      break;
+   case NATIVE_ATTACHMENT_BACK_LEFT:
+      ret = gdi_surface_swap_buffers(nsurf);
+      break;
+   default:
+      ret = FALSE;
+      break;
+   }
+
+   return ret;
+}
+
 static boolean
 gdi_surface_validate(struct native_surface *nsurf, uint attachment_mask,
                         unsigned int *seq_num, struct pipe_resource **textures,
@@ -231,8 +255,7 @@ gdi_display_create_window_surface(struct native_display *ndpy,
    gdi_surface_update_geometry(&gsurf->base);
 
    gsurf->base.destroy = gdi_surface_destroy;
-   gsurf->base.swap_buffers = gdi_surface_swap_buffers;
-   gsurf->base.flush_frontbuffer = gdi_surface_flush_frontbuffer;
+   gsurf->base.present = gdi_surface_present;
    gsurf->base.validate = gdi_surface_validate;
    gsurf->base.wait = gdi_surface_wait;
 
@@ -260,7 +283,7 @@ fill_color_formats(struct native_display *ndpy, enum pipe_format formats[8])
 
    for (i = 0; i < Elements(candidates); i++) {
       if (screen->is_format_supported(screen, candidates[i],
-               PIPE_TEXTURE_2D, 0, PIPE_BIND_RENDER_TARGET, 0))
+               PIPE_TEXTURE_2D, 0, PIPE_BIND_RENDER_TARGET))
          formats[count++] = candidates[i];
    }
 
@@ -294,7 +317,6 @@ gdi_display_get_configs(struct native_display *ndpy, int *num_configs)
          nconf->color_format = formats[i];
 
          nconf->window_bit = TRUE;
-         nconf->slow_config = TRUE;
       }
 
       gdpy->num_configs = count;
@@ -321,6 +343,8 @@ gdi_display_get_param(struct native_display *ndpy,
       /* private buffers are allocated */
       val = FALSE;
       break;
+   case NATIVE_PARAM_PRESERVE_BUFFER:
+   case NATIVE_PARAM_MAX_SWAP_INTERVAL:
    default:
       val = 0;
       break;
@@ -337,14 +361,33 @@ gdi_display_destroy(struct native_display *ndpy)
    if (gdpy->configs)
       FREE(gdpy->configs);
 
-   gdpy->base.screen->destroy(gdpy->base.screen);
+   ndpy_uninit(ndpy);
 
    FREE(gdpy);
 }
 
+static boolean
+gdi_display_init_screen(struct native_display *ndpy)
+{
+   struct gdi_display *gdpy = gdi_display(ndpy);
+   struct sw_winsys *winsys;
+
+   winsys = gdi_create_sw_winsys();
+   if (!winsys)
+      return FALSE;
+
+   gdpy->base.screen = gdpy->event_handler->new_sw_screen(&gdpy->base, winsys);
+   if (!gdpy->base.screen) {
+      if (winsys->destroy)
+         winsys->destroy(winsys);
+      return FALSE;
+   }
+
+   return TRUE;
+}
+
 static struct native_display *
-gdi_create_display(HDC hDC, struct pipe_screen *screen,
-                   struct native_event_handler *event_handler)
+gdi_create_display(HDC hDC, const struct native_event_handler *event_handler)
 {
    struct gdi_display *gdpy;
 
@@ -355,8 +398,7 @@ gdi_create_display(HDC hDC, struct pipe_screen *screen,
    gdpy->hDC = hDC;
    gdpy->event_handler = event_handler;
 
-   gdpy->base.screen = screen;
-
+   gdpy->base.init_screen = gdi_display_init_screen;
    gdpy->base.destroy = gdi_display_destroy;
    gdpy->base.get_param = gdi_display_get_param;
 
@@ -366,40 +408,22 @@ gdi_create_display(HDC hDC, struct pipe_screen *screen,
    return &gdpy->base;
 }
 
-struct native_probe *
-native_create_probe(void *dpy)
-{
-   return NULL;
-}
+static const struct native_event_handler *gdi_event_handler;
 
-enum native_probe_result
-native_get_probe_result(struct native_probe *nprobe)
+static struct native_display *
+native_create_display(void *dpy, boolean use_sw)
 {
-   return NATIVE_PROBE_UNKNOWN;
+   return gdi_create_display((HDC) dpy, gdi_event_handler);
 }
 
-const char *
-native_get_name(void)
-{
-   return "GDI";
-}
+static const struct native_platform gdi_platform = {
+   "GDI", /* name */
+   native_create_display
+};
 
-struct native_display *
-native_create_display(void *dpy, struct native_event_handler *event_handler)
+const struct native_platform *
+native_get_gdi_platform(const struct native_event_handler *event_handler)
 {
-   struct sw_winsys *winsys;
-   struct pipe_screen *screen;
-
-   winsys = gdi_create_sw_winsys();
-   if (!winsys)
-      return NULL;
-
-   screen = native_create_sw_screen(winsys);
-   if (!screen) {
-      if (winsys->destroy)
-         winsys->destroy(winsys);
-      return NULL;
-   }
-
-   return gdi_create_display((HDC) dpy, screen, event_handler);
+   gdi_event_handler = event_handler;
+   return &gdi_platform;
 }