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