st/egl: Update KMS backend to use resource_surface.
authorChia-I Wu <olv@lunarg.com>
Mon, 31 May 2010 08:51:10 +0000 (16:51 +0800)
committerChia-I Wu <olv@lunarg.com>
Mon, 31 May 2010 09:03:58 +0000 (17:03 +0800)
src/gallium/state_trackers/egl/kms/native_kms.c
src/gallium/state_trackers/egl/kms/native_kms.h

index 27cf84e0fe727280fa28061fbc67a2b4f807d42f..bfb4a9d25889bfe81f94b0e803185c487278d3ea 100644 (file)
@@ -40,39 +40,11 @@ kms_surface_validate(struct native_surface *nsurf, uint attachment_mask,
                      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_resource templ, *ptex;
-   int att;
-
-   if (attachment_mask) {
-      memset(&templ, 0, sizeof(templ));
-      templ.target = PIPE_TEXTURE_2D;
-      templ.last_level = 0;
-      templ.width0 = ksurf->width;
-      templ.height0 = ksurf->height;
-      templ.depth0 = 1;
-      templ.format = ksurf->color_format;
-      templ.bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SCANOUT;
-   }
-
-   /* create textures */
-   for (att = 0; att < NUM_NATIVE_ATTACHMENTS; att++) {
-      /* delay the allocation */
-      if (!native_attachment_mask_test(attachment_mask, att))
-         continue;
-
-      ptex = ksurf->textures[att];
-      if (!ptex) {
-         ptex = screen->resource_create(screen, &templ);
-         ksurf->textures[att] = ptex;
-      }
 
-      if (textures) {
-         textures[att] = NULL;
-         pipe_resource_reference(&textures[att], ptex);
-      }
-   }
+   if (!resource_surface_add_resources(ksurf->rsurf, attachment_mask))
+      return FALSE;
+   if (textures)
+      resource_surface_get_resources(ksurf->rsurf, textures, attachment_mask);
 
    if (seq_num)
       *seq_num = ksurf->sequence_number;
@@ -112,11 +84,11 @@ 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, 1 << natt, NULL, NULL, NULL, NULL);
-         if (!ksurf->textures[natt])
+         resource_surface_add_resources(ksurf->rsurf, 1 << natt);
+         fb->texture =
+            resource_surface_get_single_resource(ksurf->rsurf, natt);
+         if (!fb->texture)
             return FALSE;
-
-         pipe_resource_reference(&fb->texture, ksurf->textures[natt]);
       }
 
       /* already initialized */
@@ -167,7 +139,6 @@ kms_surface_swap_buffers(struct native_surface *nsurf)
    struct kms_crtc *kcrtc = &ksurf->current_crtc;
    struct kms_display *kdpy = ksurf->kdpy;
    struct kms_framebuffer tmp_fb;
-   struct pipe_resource *tmp_texture;
    int err;
 
    if (!ksurf->back_fb.buffer_id) {
@@ -188,11 +159,8 @@ kms_surface_swap_buffers(struct native_surface *nsurf)
    ksurf->front_fb = ksurf->back_fb;
    ksurf->back_fb = tmp_fb;
 
-   tmp_texture = ksurf->textures[NATIVE_ATTACHMENT_FRONT_LEFT];
-   ksurf->textures[NATIVE_ATTACHMENT_FRONT_LEFT] =
-      ksurf->textures[NATIVE_ATTACHMENT_BACK_LEFT];
-   ksurf->textures[NATIVE_ATTACHMENT_BACK_LEFT] = tmp_texture;
-
+   resource_surface_swap_buffers(ksurf->rsurf,
+         NATIVE_ATTACHMENT_FRONT_LEFT, NATIVE_ATTACHMENT_BACK_LEFT, FALSE);
    /* the front/back textures are swapped */
    ksurf->sequence_number++;
    kdpy->event_handler->invalid_surface(&kdpy->base,
@@ -211,7 +179,6 @@ static void
 kms_surface_destroy(struct native_surface *nsurf)
 {
    struct kms_surface *ksurf = kms_surface(nsurf);
-   int i;
 
    if (ksurf->current_crtc.crtc)
          drmModeFreeCrtc(ksurf->current_crtc.crtc);
@@ -224,11 +191,7 @@ kms_surface_destroy(struct native_surface *nsurf)
       drmModeRmFB(ksurf->kdpy->fd, ksurf->back_fb.buffer_id);
    pipe_resource_reference(&ksurf->back_fb.texture, NULL);
 
-   for (i = 0; i < NUM_NATIVE_ATTACHMENTS; i++) {
-      struct pipe_resource *ptex = ksurf->textures[i];
-      pipe_resource_reference(&ptex, NULL);
-   }
-
+   resource_surface_destroy(ksurf->rsurf);
    FREE(ksurf);
 }
 
@@ -250,6 +213,19 @@ kms_display_create_surface(struct native_display *ndpy,
    ksurf->width = width;
    ksurf->height = height;
 
+   ksurf->rsurf = resource_surface_create(kdpy->base.screen,
+         ksurf->color_format,
+         PIPE_BIND_RENDER_TARGET |
+         PIPE_BIND_SAMPLER_VIEW |
+         PIPE_BIND_DISPLAY_TARGET |
+         PIPE_BIND_SCANOUT);
+   if (!ksurf->rsurf) {
+      FREE(ksurf);
+      return NULL;
+   }
+
+   resource_surface_set_size(ksurf->rsurf, ksurf->width, ksurf->height);
+
    ksurf->base.destroy = kms_surface_destroy;
    ksurf->base.swap_buffers = kms_surface_swap_buffers;
    ksurf->base.flush_frontbuffer = kms_surface_flush_frontbuffer;
index 3b08e930c52bfc84cbb286319ab072f665104f25..d69c8d38c83ba65cae4b80bb4458b6c52e045c7d 100644 (file)
@@ -35,6 +35,7 @@
 #include "state_tracker/drm_api.h"
 
 #include "common/native.h"
+#include "common/native_helper.h"
 
 struct kms_config;
 struct kms_connector;
@@ -73,11 +74,12 @@ struct kms_framebuffer {
 
 struct kms_surface {
    struct native_surface base;
-   enum pipe_format color_format;
    struct kms_display *kdpy;
+
+   struct resource_surface *rsurf;
+   enum pipe_format color_format;
    int width, height;
 
-   struct pipe_resource *textures[NUM_NATIVE_ATTACHMENTS];
    unsigned int sequence_number;
    struct kms_framebuffer front_fb, back_fb;