swc

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/swc
Log | Files | Refs | README | LICENSE

commit cdc1730daa8cc20af611b4c582370d19823b7bed
parent feee7c00017b04799c46b7335f2df54be644f5ee
Author: Michael Forney <mforney@mforney.org>
Date:   Fri, 14 Jun 2013 03:16:44 -0700

Add context to renderer

Diffstat:
Mrenderer.c | 70+++++++++++++++++++++++++++++++++++++++++++++++++---------------------
Mrenderer.h | 9++++++++-
2 files changed, 57 insertions(+), 22 deletions(-)

diff --git a/renderer.c b/renderer.c @@ -21,6 +21,40 @@ static inline uint32_t format_wayland_to_pixman(uint32_t wayland_format) return 0; } +static inline void switch_context(struct swc_renderer * renderer, + uint32_t context, struct swc_buffer * buffer) +{ + if (renderer->context != context) + { + /* Leave old context */ + switch (renderer->context) + { + case SWC_RENDERER_CONTEXT_NONE: + break; + case SWC_RENDERER_CONTEXT_BATCH: + intel_batch_flush(&renderer->batch); + break; + case SWC_RENDERER_CONTEXT_SHM: + drm_intel_gem_bo_unmap_gtt(buffer->bo); + break; + } + + /* Enter new context */ + switch (context) + { + case SWC_RENDERER_CONTEXT_NONE: + break; + case SWC_RENDERER_CONTEXT_BATCH: + break; + case SWC_RENDERER_CONTEXT_SHM: + drm_intel_gem_bo_map_gtt(buffer->bo); + break; + } + + renderer->context = context; + } +} + static void repaint_surface_for_output(struct swc_renderer * renderer, struct swc_surface * surface, struct swc_output * output) @@ -31,7 +65,10 @@ static void repaint_surface_for_output(struct swc_renderer * renderer, { pixman_image_t * buffer_image; + switch_context(renderer, SWC_RENDERER_CONTEXT_SHM, back_buffer); + printf("repainting shm surface\n"); + buffer_image = pixman_image_create_bits_no_clear (PIXMAN_x8r8g8b8, back_buffer->width, back_buffer->height, back_buffer->bo->virtual, back_buffer->pitch); @@ -44,14 +81,17 @@ static void repaint_surface_for_output(struct swc_renderer * renderer, } else { - /* - struct intel_bo * src = &surface->renderer_state.drm.bo; + switch_context(renderer, SWC_RENDERER_CONTEXT_BATCH, back_buffer); + + printf("repainting drm surface\n"); + + drm_intel_bo * src = surface->renderer_state.drm.bo; uint32_t src_pitch = surface->renderer_state.drm.pitch; xy_src_copy_blt(&renderer->batch, src, src_pitch, 0, 0, - &back_buffer->bo, back_buffer->pitch, 0, 0, + back_buffer->bo, back_buffer->pitch, + surface->geometry.x, surface->geometry.y, surface->geometry.width, surface->geometry.height); - */ } } @@ -77,8 +117,11 @@ void swc_renderer_repaint_output(struct swc_renderer * renderer, struct wl_list * surfaces) { struct swc_surface * surface; + struct swc_buffer * back_buffer; + + back_buffer = swc_output_get_back_buffer(output); - printf("repainting output %u\n", output->id); + switch_context(renderer, SWC_RENDERER_CONTEXT_BATCH, back_buffer); wl_list_for_each(surface, surfaces, link) { @@ -88,13 +131,7 @@ void swc_renderer_repaint_output(struct swc_renderer * renderer, } } - xy_color_blt(&renderer->batch, swc_output_get_back_buffer(output)->bo, - swc_output_get_back_buffer(output)->pitch, 0, 0, 500, 500, - 0xffffffff); - - //mi_flush(&renderer->batch, false, false, false, false, false, false); - - intel_batch_flush(&renderer->batch); + switch_context(renderer, SWC_RENDERER_CONTEXT_NONE, back_buffer); } void swc_renderer_attach(struct swc_renderer * renderer, @@ -116,15 +153,6 @@ void swc_renderer_attach(struct swc_renderer * renderer, wl_shm_buffer_get_height(buffer), wl_shm_buffer_get_data(buffer), wl_shm_buffer_get_stride(buffer)); - - wl_list_for_each(output, outputs, link) - { - if (surface->output_mask & (1 << output->id)) - { - swc_buffer_ref_image(&output->buffers[0]); - swc_buffer_ref_image(&output->buffers[1]); - } - } } /* DRM buffer */ else if ((bo = gbm_bo_import(renderer->gbm, GBM_BO_IMPORT_WL_BUFFER, buffer, diff --git a/renderer.h b/renderer.h @@ -6,11 +6,18 @@ #include "drm.h" #include "intel/batch.h" +enum swc_renderer_context +{ + SWC_RENDERER_CONTEXT_NONE, + SWC_RENDERER_CONTEXT_SHM, + SWC_RENDERER_CONTEXT_BATCH +}; + struct swc_renderer { struct swc_drm * drm; struct gbm_device * gbm; - + enum swc_renderer_context context; struct intel_batch batch; };