commit cdc1730

Michael Forney  ·  2013-06-14 10:16:44 +0000 UTC
parent feee7c0
Add context to renderer
2 files changed,  +57, -22
+49, -21
  1@@ -21,6 +21,40 @@ static inline uint32_t format_wayland_to_pixman(uint32_t wayland_format)
  2     return 0;
  3 }
  4 
  5+static inline void switch_context(struct swc_renderer * renderer,
  6+                                  uint32_t context, struct swc_buffer * buffer)
  7+{
  8+    if (renderer->context != context)
  9+    {
 10+        /* Leave old context */
 11+        switch (renderer->context)
 12+        {
 13+            case SWC_RENDERER_CONTEXT_NONE:
 14+                break;
 15+            case SWC_RENDERER_CONTEXT_BATCH:
 16+                intel_batch_flush(&renderer->batch);
 17+                break;
 18+            case SWC_RENDERER_CONTEXT_SHM:
 19+                drm_intel_gem_bo_unmap_gtt(buffer->bo);
 20+                break;
 21+        }
 22+
 23+        /* Enter new context */
 24+        switch (context)
 25+        {
 26+            case SWC_RENDERER_CONTEXT_NONE:
 27+                break;
 28+            case SWC_RENDERER_CONTEXT_BATCH:
 29+                break;
 30+            case SWC_RENDERER_CONTEXT_SHM:
 31+                drm_intel_gem_bo_map_gtt(buffer->bo);
 32+                break;
 33+        }
 34+
 35+        renderer->context = context;
 36+    }
 37+}
 38+
 39 static void repaint_surface_for_output(struct swc_renderer * renderer,
 40                                        struct swc_surface * surface,
 41                                        struct swc_output * output)
 42@@ -31,7 +65,10 @@ static void repaint_surface_for_output(struct swc_renderer * renderer,
 43     {
 44         pixman_image_t * buffer_image;
 45 
 46+        switch_context(renderer, SWC_RENDERER_CONTEXT_SHM, back_buffer);
 47+
 48         printf("repainting shm surface\n");
 49+
 50         buffer_image = pixman_image_create_bits_no_clear
 51             (PIXMAN_x8r8g8b8, back_buffer->width, back_buffer->height,
 52              back_buffer->bo->virtual, back_buffer->pitch);
 53@@ -44,14 +81,17 @@ static void repaint_surface_for_output(struct swc_renderer * renderer,
 54     }
 55     else
 56     {
 57-        /*
 58-        struct intel_bo * src = &surface->renderer_state.drm.bo;
 59+        switch_context(renderer, SWC_RENDERER_CONTEXT_BATCH, back_buffer);
 60+
 61+        printf("repainting drm surface\n");
 62+
 63+        drm_intel_bo * src = surface->renderer_state.drm.bo;
 64         uint32_t src_pitch = surface->renderer_state.drm.pitch;
 65 
 66         xy_src_copy_blt(&renderer->batch, src, src_pitch, 0, 0,
 67-                        &back_buffer->bo, back_buffer->pitch, 0, 0,
 68+                        back_buffer->bo, back_buffer->pitch,
 69+                        surface->geometry.x, surface->geometry.y,
 70                         surface->geometry.width, surface->geometry.height);
 71-        */
 72     }
 73 }
 74 
 75@@ -77,8 +117,11 @@ void swc_renderer_repaint_output(struct swc_renderer * renderer,
 76                                  struct wl_list * surfaces)
 77 {
 78     struct swc_surface * surface;
 79+    struct swc_buffer * back_buffer;
 80+
 81+    back_buffer = swc_output_get_back_buffer(output);
 82 
 83-    printf("repainting output %u\n", output->id);
 84+    switch_context(renderer, SWC_RENDERER_CONTEXT_BATCH, back_buffer);
 85 
 86     wl_list_for_each(surface, surfaces, link)
 87     {
 88@@ -88,13 +131,7 @@ void swc_renderer_repaint_output(struct swc_renderer * renderer,
 89         }
 90     }
 91 
 92-    xy_color_blt(&renderer->batch, swc_output_get_back_buffer(output)->bo,
 93-                 swc_output_get_back_buffer(output)->pitch, 0, 0, 500, 500,
 94-                 0xffffffff);
 95-
 96-    //mi_flush(&renderer->batch, false, false, false, false, false, false);
 97-
 98-    intel_batch_flush(&renderer->batch);
 99+    switch_context(renderer, SWC_RENDERER_CONTEXT_NONE, back_buffer);
100 }
101 
102 void swc_renderer_attach(struct swc_renderer * renderer,
103@@ -116,15 +153,6 @@ void swc_renderer_attach(struct swc_renderer * renderer,
104                                        wl_shm_buffer_get_height(buffer),
105                                        wl_shm_buffer_get_data(buffer),
106                                        wl_shm_buffer_get_stride(buffer));
107-
108-        wl_list_for_each(output, outputs, link)
109-        {
110-            if (surface->output_mask & (1 << output->id))
111-            {
112-                swc_buffer_ref_image(&output->buffers[0]);
113-                swc_buffer_ref_image(&output->buffers[1]);
114-            }
115-        }
116     }
117     /* DRM buffer */
118     else if ((bo = gbm_bo_import(renderer->gbm, GBM_BO_IMPORT_WL_BUFFER, buffer,
+8, -1
 1@@ -6,11 +6,18 @@
 2 #include "drm.h"
 3 #include "intel/batch.h"
 4 
 5+enum swc_renderer_context
 6+{
 7+    SWC_RENDERER_CONTEXT_NONE,
 8+    SWC_RENDERER_CONTEXT_SHM,
 9+    SWC_RENDERER_CONTEXT_BATCH
10+};
11+
12 struct swc_renderer
13 {
14     struct swc_drm * drm;
15     struct gbm_device * gbm;
16-
17+    enum swc_renderer_context context;
18     struct intel_batch batch;
19 };
20