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;
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,
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;
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];
}
nconf->color_format = formats[i];
nconf->window_bit = TRUE;
- nconf->slow_config = TRUE;
}
gdpy->num_configs = count;
/* private buffers are allocated */
val = FALSE;
break;
+ case NATIVE_PARAM_PRESERVE_BUFFER:
+ case NATIVE_PARAM_MAX_SWAP_INTERVAL:
default:
val = 0;
break;
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;
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;
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;
}