diff options
Diffstat (limited to 'src/gallium/state_trackers/egl_g3d/kms/native_kms.c')
-rw-r--r-- | src/gallium/state_trackers/egl_g3d/kms/native_kms.c | 58 |
1 files changed, 23 insertions, 35 deletions
diff --git a/src/gallium/state_trackers/egl_g3d/kms/native_kms.c b/src/gallium/state_trackers/egl_g3d/kms/native_kms.c index 0e0babdb14..dc66436630 100644 --- a/src/gallium/state_trackers/egl_g3d/kms/native_kms.c +++ b/src/gallium/state_trackers/egl_g3d/kms/native_kms.c @@ -33,22 +33,17 @@ #include "native_kms.h" static boolean -kms_surface_validate(struct native_surface *nsurf, - const enum native_attachment *natts, - unsigned num_natts, - struct pipe_texture **textures, +kms_surface_validate(struct native_surface *nsurf, uint attachment_mask, + unsigned int *seq_num, struct pipe_texture **textures, int *width, int *height) { struct kms_surface *ksurf = kms_surface(nsurf); struct kms_display *kdpy = ksurf->kdpy; struct pipe_screen *screen = kdpy->base.screen; struct pipe_texture templ, *ptex; - int i; - - if (num_natts) { - if (textures) - memset(textures, 0, sizeof(*textures) * num_natts); + int att; + if (attachment_mask) { memset(&templ, 0, sizeof(templ)); templ.target = PIPE_TEXTURE_2D; templ.last_level = 0; @@ -62,19 +57,25 @@ kms_surface_validate(struct native_surface *nsurf, } /* create textures */ - for (i = 0; i < num_natts; i++) { - enum native_attachment natt = natts[i]; + for (att = 0; att < NUM_NATIVE_ATTACHMENTS; att++) { + /* delay the allocation */ + if (!native_attachment_mask_test(attachment_mask, att)) + continue; - ptex = ksurf->textures[natt]; + ptex = ksurf->textures[att]; if (!ptex) { ptex = screen->texture_create(screen, &templ); - ksurf->textures[natt] = ptex; + ksurf->textures[att] = ptex; } - if (textures) - pipe_texture_reference(&textures[i], ptex); + if (textures) { + textures[att] = NULL; + pipe_texture_reference(&textures[att], ptex); + } } + if (seq_num) + *seq_num = ksurf->sequence_number; if (width) *width = ksurf->width; if (height) @@ -111,7 +112,7 @@ kms_surface_init_framebuffers(struct native_surface *nsurf, boolean need_back) if (!fb->texture) { /* make sure the texture has been allocated */ - kms_surface_validate(&ksurf->base, &natt, 1, NULL, NULL, NULL); + kms_surface_validate(&ksurf->base, 1 << natt, NULL, NULL, NULL, NULL); if (!ksurf->textures[natt]) return FALSE; @@ -196,6 +197,9 @@ kms_surface_swap_buffers(struct native_surface *nsurf) ksurf->textures[NATIVE_ATTACHMENT_BACK_LEFT]; ksurf->textures[NATIVE_ATTACHMENT_BACK_LEFT] = tmp_texture; + /* the front/back textures are swapped */ + ksurf->sequence_number++; + return TRUE; } @@ -764,8 +768,7 @@ static struct native_display_modeset kms_display_modeset = { }; static struct native_display * -kms_create_display(EGLNativeDisplayType dpy, struct drm_api *api, - native_flush_frontbuffer flush_frontbuffer) +kms_create_display(EGLNativeDisplayType dpy, struct drm_api *api) { struct kms_display *kdpy; @@ -807,10 +810,6 @@ kms_create_display(EGLNativeDisplayType dpy, struct drm_api *api, return NULL; } - kdpy->base.screen->flush_frontbuffer = - (void (*)(struct pipe_screen *, struct pipe_surface *, void *)) - flush_frontbuffer; - kdpy->base.destroy = kms_display_destroy; kdpy->base.get_configs = kms_display_get_configs; kdpy->base.create_context = kms_display_create_context; @@ -821,13 +820,6 @@ kms_create_display(EGLNativeDisplayType dpy, struct drm_api *api, return &kdpy->base; } -static void -dummy_flush_frontbuffer(void *dummy, struct pipe_surface *surf, - void *context_private) -{ - _eglLog(_EGL_WARNING, "flush_frontbuffer is not supplied"); -} - /* the api is destroyed with the native display */ static struct drm_api *drm_api; @@ -848,19 +840,15 @@ native_get_name(void) } struct native_display * -native_create_display(EGLNativeDisplayType dpy, - native_flush_frontbuffer flush_frontbuffer) +native_create_display(EGLNativeDisplayType dpy) { struct native_display *ndpy = NULL; if (!drm_api) drm_api = drm_api_create(); - if (!flush_frontbuffer) - flush_frontbuffer = dummy_flush_frontbuffer; - if (drm_api) - ndpy = kms_create_display(dpy, drm_api, flush_frontbuffer); + ndpy = kms_create_display(dpy, drm_api); return ndpy; } |