Changeset 5271e4c in mainline for uspace/srv/hid/display


Ignore:
Timestamp:
2020-06-22T12:20:42Z (5 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
195b7b3
Parents:
66a408f7
git-author:
Jiri Svoboda <jiri@…> (2020-06-21 15:20:18)
git-committer:
Jiri Svoboda <jiri@…> (2020-06-22 12:20:42)
Message:

Duplicate rendering to additional output devices using a cloning GC

This gives the display server a pretty good illusion of rendering to just
one output device, while supporting multiple. This makes RFB work properly.

Location:
uspace/srv/hid/display
Files:
4 added
5 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/hid/display/ddev.c

    r66a408f7 r5271e4c  
    141141        }
    142142
    143         rc = ds_display_paint_bg(display, NULL);
     143        rc = ds_display_paint(display, NULL);
    144144        if (rc != EOK)
    145145                return rc;
  • uspace/srv/hid/display/display.c

    r66a408f7 r5271e4c  
    4242#include <stdlib.h>
    4343#include "client.h"
     44#include "clonegc.h"
    4445#include "cursimg.h"
    4546#include "cursor.h"
     
    505506                disp->rect = ddev->info.rect;
    506507
     508                /* Create cloning GC */
     509                rc = ds_clonegc_create(ddev->gc, &disp->fbgc);
     510                if (rc != EOK) {
     511                        // XXX Remove output
     512                        return ENOMEM;
     513                }
     514
    507515                /* Allocate backbuffer */
    508516                rc = ds_display_alloc_backbuf(disp);
     517                if (rc != EOK) {
     518                        // XXX Remove output
     519                        // XXX Delete clone GC
     520                        goto error;
     521                }
     522        } else {
     523                /* Add new output device to cloning GC */
     524                rc = ds_clonegc_add_output(disp->fbgc, ddev->gc);
    509525                if (rc != EOK)
    510526                        goto error;
     
    596612static gfx_context_t *ds_display_get_unbuf_gc(ds_display_t *display)
    597613{
    598         ds_ddev_t *ddev;
    599 
    600         /*
    601          * XXX To properly support multiple display devices, create
    602          * a cloning GC that copies rendering operation to each output.
    603          */
    604         ddev = ds_display_first_ddev(display);
    605         if (ddev == NULL)
    606                 return NULL;
    607 
    608         return ddev->gc;
     614        /* In case of unit tests */
     615        if (display->fbgc == NULL)
     616                return NULL;
     617
     618        return ds_clonegc_get_ctx(display->fbgc);
    609619}
    610620
  • uspace/srv/hid/display/meson.build

    r66a408f7 r5271e4c  
    3131src = files(
    3232        'client.c',
     33        'clonegc.c',
    3334        'cursor.c',
    3435        'cursimg.c',
     
    4546test_src = files(
    4647        'client.c',
     48        'clonegc.c',
    4749        'cursimg.c',
    4850        'cursor.c',
     
    5254        'window.c',
    5355        'test/client.c',
     56        'test/clonegc.c',
    5457        'test/cursor.c',
    5558        'test/display.c',
  • uspace/srv/hid/display/test/main.c

    r66a408f7 r5271e4c  
    3232
    3333PCUT_IMPORT(client);
     34PCUT_IMPORT(clonegc);
    3435PCUT_IMPORT(cursor);
    3536PCUT_IMPORT(display);
  • uspace/srv/hid/display/types/display/display.h

    r66a408f7 r5271e4c  
    4545#include <types/display/cursor.h>
    4646#include "cursor.h"
     47#include "clonegc.h"
    4748#include "window.h"
    4849
     
    100101        mem_gc_t *bbgc;
    101102
     103        /** Frontbuffer (clone) GC */
     104        ds_clonegc_t *fbgc;
     105
    102106        /** Backbuffer dirty rectangle */
    103107        gfx_rect_t dirty_rect;
Note: See TracChangeset for help on using the changeset viewer.